您的位置:首页 > 大数据 > 人工智能

使用Promise和async-await实现的一个异步遍历+同步执行任务的实例

2017-07-13 11:38 1486 查看
假设我们需要做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中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐