使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
来源:互联网 发布:js 模块化开发 编辑:程序博客网 时间:2024/05/01 22:57
假设我们需要做N个同样的检测任务,检测完成后会将结果存入数据库。
我们希望每个检测是同步完成的,完成后再进行储存。
同时,我们又希望这些任务一起开始执行。
不需要检查这些任务何时完毕。
/** * 检测一个接口,返回检测结果 * @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中。
阅读全文
0 0
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- Promise,同步异步,Async/await
- Promise 、Async/Await的使用
- Promise、Async/Await的使用
- 前端的异步解决方案之Promise和Await-Async
- 前端的异步解决方案之Promise和Await-Async
- 使用 Async 和 Await 的异步编程
- async 和await的结合promise用法
- 关于Promise,Generator,async / await 对异步的处理
- .NET中使用异步Async和Await的代价
- promise 和async await
- Async/await和promise
- c# async、await的使用,异步方法
- Async和Await异步编程的原理
- async 和 await 的异步处理
- Async和Await异步编程的原理
- Callback Promise Generator Async-Await 和异常处理的演进
- Callback Promise Generator Async-Await 和异常处理的演进
- MTK6735 添加一个新的FLASH芯片--KMFNX0012M_B214
- 【BFS】poj 1979 Red and Black
- LeetCode14-Longest Common Prefix
- 图论刷题进程
- 数据对接—kettle使用知识7
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- ES6中var/let/const的区别
- 洛谷 P1219 八皇后
- The Meeting Place Can Not Be Changed(二分)
- Java的自定义注解编写、使用、获取
- NuGet离线安装包获取方法
- Android学习之App基础
- Drools入门学习
- Android 桌面图标右上角数字