这里最简单的方法是直接或通过使用 Promiseasync
/await
句法。在这种情况下,可能直接。
首先,你必须使asyncFunctionCall
返回一个承诺。看起来你总是返回一个布尔值,所以在这种情况下我们总是会解决承诺:
function asyncFunctionCall(url) {
return new Promise(resolve => {
request(url, function (error, response, body) {
if(typeof response !== 'undefined') {
if((response.statusCode >= 400 && response.statusCode <= 451)
|| (response.statusCode >= 500 && response.statusCode <= 511)) {
resolve(true);
return;
}
}
resolve(false);
});
});
}
然后,建立一系列你的承诺,并使用Promise.all
等待所有这些都完成。这些调用运行在平行下:
function write(bla) { // gets called one after another
const promises = [];
for(var url in bla) {
promises.push(asyncFunctionCall(url)); // Executed about 50 times.
}
return Promise.all(promises);
}
然后你可以建立一个包含所有承诺的链write
所以他们串联运行:
let p = Promise.resolve();
for (const foo in bar) { // <== Notice `const`
// See "Edit" below
p = p.then(() => {
// Here i parse the json object "foo" in the json array "bar"
// bla is an array of multiple urls.
return write(foo[bla]));
});
}
请注意,使用这一点很重要const
or let
, not var
, for foo
在那个循环中,因为then
回调结束;看这个问题的答案 http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example为什么const
and let
使之发挥作用。
每次致电write
只有当前一个工作完成后才会进行。
然后等待整个过程完成:
p.then(() => {
// All done
});
你还没有展示任何东西using布尔值来自write
的请求,但它们可以(作为数组)作为承诺的解析值write
.
该过程的第二部分,我们称之为write
,也可以写成async
函数可以使逻辑流程更清晰:
async function doTheWrites() {
for (const foo in bar) {
// Here i parse the json object "foo" in the json array "bar"
// bla is an array of multiple urls.
await write(foo[bla]);
}
}
那么整体流程:
doTheWrites().then(() => {
// All done
});
...或者如果这是also in an async
功能:
await doTheWrites();