使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
2017-07-13 11:38
1486 查看
假设我们需要做N个同样的检测任务,检测完成后会将结果存入数据库。
我们希望每个检测是同步完成的,完成后再进行储存。
同时,我们又希望这些任务一起开始执行。
不需要检查这些任务何时完毕。
如果希望获取全部完成的时机,可以使用Promise.all()。
利用了几个机制:
await可以把promise对象的resolve中的值提出来。
async函数,若不加await直接调用,会异步执行。 即使async内部会同步执行完后才返回值,不加await也会立刻异步返回一个Promise对象。
Promise.all(Iterable).then((valueArray)=>())会等Iterable对象中所有Promise对象执行完毕后,再执行then()。所有结果包含在valueArray中。
我们希望每个检测是同步完成的,完成后再进行储存。
同时,我们又希望这些任务一起开始执行。
不需要检查这些任务何时完毕。
/** * 检测一个接口,返回检测结果 * @param host * @param port * @returns {Promise} */ function detectOnePromise(host, port) { return new Promise((resolve, reject) => { let start = new Date().getTime(); let state = -1; console.log(`detecting ${host}:${port} ...`) let check = net.connect({host, port}, () => { console.log(`${host}:${port} is openning`); state = 0; try { check.destroy(); } catch (e) { throw e; } }); setTimeout(() => { console.log(`detect ${host}:${port} timeout`); state = 2; check.destroy(); }, timeout); check.on('error', (err) => { if (err.errno === 'ECONNREFUSED') { console.log(`${host}:${port} is closed`); state = 1; check.destroy(); } }); check.on('close', () => { resolve({port, state, time: new Date().getTime() - start}); }); }); } /** * 遍历检测所有库存端口,并记录结果 */ function detectAll() { async function dectectOne (host, port) { let result = await detectOnePromise(host, port); console.log(result); // TODO 同步存入数据库 } let host = '127.0.0.1'; let ports = ['10100','10101','10102']; // 遍历端口,每个端口的检测同时开始执行 for (port of ports) { dectectOne(host, port); } } detectAll();
如果希望获取全部完成的时机,可以使用Promise.all()。
利用了几个机制:
await可以把promise对象的resolve中的值提出来。
async函数,若不加await直接调用,会异步执行。 即使async内部会同步执行完后才返回值,不加await也会立刻异步返回一个Promise对象。
Promise.all(Iterable).then((valueArray)=>())会等Iterable对象中所有Promise对象执行完毕后,再执行then()。所有结果包含在valueArray中。
相关文章推荐
- asp.net webform中使用async,await实现异步操作
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- node下使用async同步执行异步函数
- 用async-await实现类似Promise.all()的执行效果
- spring boot使用自定义配置的线程池执行Async异步任务
- .NET4.0中使用4.5中的 async/await 功能实现异步
- 在tornado中使用celery实现异步任务处理之中的一个
- NodeJS-Promise、await、async异步变同步
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- spring boot使用自定义配置的线程池执行Async异步任务
- 一种通过async/await实现函数同步执行的方式
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- Java实例说明 100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况
- GCD编程dispatch_sync(同步)和dispatch_async(异步)方式执行并发队列任务区别
- LazyMay:实现同步和异步任务的顺序执行
- 使用Typescript写的Vue初学者Hello World实例(实现按需加载、跨域调试、await/async)
- Promise,同步异步,Async/await