假设我们需要做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中。
版权声明:本文为github_38589282原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。