async

promise, async和await

杀马特。学长 韩版系。学妹 提交于 2019-12-16 12:40:00
最开始实现异步的方法:回调函数 method1(function(err, result) { if (err) { throw err; } method2(function(err, result) { if (err) { throw err; } method3(function(err, result) { if (err) { throw err; } method4(function(err, result) { if (err) { throw err; } method5(result); }); }); }); }); 回调地狱一层一层嵌套多个回调函数,会使代码错综复杂,难以理解和调试。 promise promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件,更合理更强大。所谓promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,promise是一个对象,可以获取异步操作的消息,提供统一的API,各种异步操作都可以用同样的方法进行处理。 特点:1、对象状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。 2

async处理异步操作

别等时光非礼了梦想. 提交于 2019-12-16 12:09:16
async函数用async作为关键字,try和 catch来处理异常, await接受一个promise函数返回 async list () { try { await api.findjuBarData().then(res => { console.log(res) }) console.log('测试') } catch (error) { console.log(error) } }, 这个函数会先打印请求到的值再打印’测试‘ 来源: https://www.cnblogs.com/wjsy/p/12048016.html

[RUST]async-std协程库

这一生的挚爱 提交于 2019-12-16 10:23:05
Rust版本: stable 1.39 安装crate: [dependencies] async-std = "*" 简单使用(基于manager-workers模型): use async_std::{task, }; type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>; async fn manager() -> Result<()> { task::spawn(worker()); Ok(()) } async fn worker() -> Result<()> { Ok(()) } fn main() { task::block_on(manager()); } 来源: CSDN 作者: XiaoH0_0 链接: https://blog.csdn.net/XiaoH0_0/article/details/103548549

建议收藏:不容错过的 Node.js 项目架构

只谈情不闲聊 提交于 2019-12-14 07:18:06
Express.js 是用于开发 Node.js REST API 的优秀框架,但是它并没有为您提供有关如何组织 Node.js 项目的任何线索。 虽然听起来很傻,但这确实是个问题。 正确的组织 Node.js 项目结构将避免重复代码、提高服务的稳定性和扩展性。 这篇文章是基于我多年来在处理一些糟糕的 Node.js 项目结构、不好的设计模式以及无数个小时的代码重构经验的探索研究。 如果您需要帮助调整 Node.js 项目架构,只需给我发一封信 sam@softwareontheroad.com。 目录 目录结构 三层架构 服务层 Pub/Sub 层 ️️️️ 依赖注入 单元测试 Cron Jobs 和重复任务 配置和密钥 Loaders 目录结构 这是我要谈论的 Node.js 项目结构。 我在构建的每个 Node.js REST API 服务中都使用了下面这个结构,让我们了解下每个组件的功能。 src │ app.js # App 入口 └───api # Express route controllers for all the endpoints of the app └───config # 环境变量和配置相关 └───jobs # 对于 agenda.js 的任务调度定义 └───loaders # 将启动过程拆分为模块 └───models # 数据库模型 └──

使用Spring的@Async创建异步方法

限于喜欢 提交于 2019-12-14 05:20:49
在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”。说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用Spring的@Async的异步注解。 假设场景 你有一个很耗时的服务,我们在下面的例子中用线程休眠来模拟,服务执行需要5秒钟。假设一个请求需要调用这个服务3次,如果按照“串行”的方法,将至少需要15秒钟。那么为了提升系统的性能,我们采用“并行”的方法,我们最乐观的情况下,只需要5秒就可以了。有人可能会说这个很简单,我们写个多线程的方法就可以了。但是,今天我们看看Spring为我们提供的方法,它使得开发的过程更简单。 创建异步方法 首先,使用IDEA工具创建Spring-Boot项目,并且选择依赖包Lombok,具体步骤略。然后创建BusyService类,并创建busyMethod方法,具体如下: @Service @Slf4j public class BusyService { @Async publicCompletableFuture<String> busyMethod(String name) throws InterruptedException { log.info(name); Strings = "Hello,"+name+"!"; //模拟耗时操作,5秒 Thread.sleep(5000);

强大的promise

喜夏-厌秋 提交于 2019-12-14 01:36:58
这个玩意叫做普罗米修斯,希腊神话的盗火英雄 promise只用来包装异步函数,同步的会搞乱执行顺序,生产BUG // 如何使用 function pro(){ return new Promise(function(resolve,reject){ setTimeout(function(){ var num = parInt(Math.random()*10); if(num>5){ resolve(num) // 这个可以写成 // return Promise.resolve(num) }else{ reject(num) // 这个可以写成 // return Promise.reject(num) } },5000) }) } // pro()这个返回的是一个pending的Promise对象 // Promise可以被then启动,参数有两个,跟new的时候对应也是两个 // new的时候第一个参数传递成功,then的时候第一个参数接受成功 // new的时候第二个参数传递失败,then的时候第二个参数接受失败 pro().then((res)=>{ ... },(error)=>{ ... }) 这个api是有固定写法的,用来把回调的异步函数转成链式的异步函数 先看看传统的回调型异步函数 function ajax1(){ ajax({ sucess:function

Springboot @Async 异步线程的异常捕获和处理的两种方式

混江龙づ霸主 提交于 2019-12-11 20:02:19
原因 Springboot有个很方便的Controller的异常捕获,如何使用可以查看 这一篇 。但是Springboot没有很方便的异步线程异常捕获和处理。 在Springboot中,我们可以通过注解@EnableAsync来开启异步任务,@Async加在需要异步执行的方法上。在这个方法中抛出的异常就是异步线程异常。那么如何捕获该异常呢?我们来看源码一步一步分析。 源码分析 首先来看异步任务开启的入口@EnableAsync @Target ( ElementType . TYPE ) @Retention ( RetentionPolicy . RUNTIME ) @Documented @Import ( AsyncConfigurationSelector . class ) public @ interface EnableAsync { AdviceMode mode ( ) default AdviceMode . PROXY ; // 省略不关键的部分... } 这里引入了AsyncConfigurationSelector配置类,并且指定默认的模式是PROXY模式,再来看AsyncConfigurationSelector配置类 public class AsyncConfigurationSelector extends

异步IO框架:asyncio 中篇

隐身守侯 提交于 2019-12-11 12:49:49
上一节我们首先介绍了,如何创建一个协程对象. 主要有两种方法 通过 async 关键字, 通过 @asyncio.coroutine 装饰函数。 然后有了协程对象,就需要一个事件循环容器来运行我们的协程。其主要的步骤有如下几点: 将协程对象转为task任务对象 定义一个事件循环对象容器用来存放task 将task任务扔进事件循环对象中并触发 上一节,其实就只是讲了协程中的 单任务,我们就来看下,协程中的 多任务。 协程中的并发 协程的并发,和线程一样。举个例子来说,就好像 一个人同时吃三个馒头,咬了第一个馒头一口,就得等这口咽下去,才能去啃第其他两个馒头。就这样交替换着吃。 asyncio 实现并发,就需要多个协程来完成任务,每当有任务阻塞的时候就await,然后其他协程继续工作。 第一步,当然是创建多个协程的列表。 # 协程函数 async def do_some_work(x): print('Waiting: ', x) await asyncio.sleep(x) return 'Done after {}s'.format(x) # 协程对象 coroutine1 = do_some_work(1) coroutine2 = do_some_work(2) coroutine3 = do_some_work(4) # 将协程转成task,并组成list tasks = [

Koa 实战 - 鉴权

最后都变了- 提交于 2019-12-11 08:00:42
学习目标 掌握三种常见鉴权方式 Session/Cookie Token OAuth session-cookie方式 cookie原理解析 // cookie.js const http = require ( "http" ) http . createServer ( ( req , res ) => { if ( req . url === '/favicon.ico' ) { return } else { console . log ( req . headers . cookie ) // cx-abc res . setHeader ( 'Set-Cookie' , 'cx-abc' ) res . end ( 'hello cookie' ) } } ) . listen ( 3000 ) session原理解析 const http = require ( "http" ) const session = require ( "session" ) http . createServer ( ( req , res ) => { const sessionKey = 'sid' if ( req . url === '/favicon.ico' ) { return } else { console . log ( req . headers . cookie

概述IOS多线程

妖精的绣舞 提交于 2019-12-10 08:36:06
     在了解多线程之前,我们需要先认识一下什么是 进程 和 线程 。 **进程:**是在系统中运行的一个程序,每个进程之间是独立的,每个进程均运行在其专有且受保护的内存空间内。 **线程:**一个进程想要执行任务,必须得有线程(至少一个线程),线程是进程的基本执行单元,一个进程的所有任务都必须在线程中执行。 **线程的串行:**一个线程中任务的执行是串行的,如果要在一个线程中执行多个任务,只能一个一个的按顺序执行。      那么如何多个任务同时进行?这 便引出了我们的多线程! 一、多线程 ###1.基本概念      一个进程中可以开启多个线程,每个线程可以并发/并行执行不同的任务,多线程可以提交程序的执行效率。如下图(同时执行任务ABC): ###2.多线程的原理      同一时间,CPU只能执行一个线程,只有一个线程正在执行,多线程并发执行,其实是CPU快速的在多个线程之间切换。如果CPU的切换线程的时间足够快,就会造成多线程并发执行的假象。 ###3.多线程的优缺点 **优点: **(1)能适当的提高程序的执行效率         (2)能适当的提高资源的利用率(CPU,内存) 缺点: (1)开启线程会占用一定的内存空间(主线程1M,子线程0.5M),如果开启过多的线程会占用大量的内存空间,降低程序的性能。        (2)线程越多,CPU在调度线程上的开销就越大