使用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中。
原创粉丝点击