javascript – Node.js – 在继续代码之前等待多个异步调用完成
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Node.js – 在继续代码之前等待多个异步调用完成,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2623字,纯文字阅读大概需要4分钟。
内容图文
![javascript – Node.js – 在继续代码之前等待多个异步调用完成](/upload/InfoBanner/zyjiaocheng/718/a0a6936ca327461ab5ce11aedd8435d9.jpg)
所以基本上我有一个带有异步函数的for循环.问题是程序在循环之后才继续,我希望它等到循环中调用的所有异步函数在代码继续之前完成.
在我的代码中,“bar”是一个json数组,其中包含其他json数组.
function write(bla) { // gets called one after another
for(var url in bla) {
asyncFunctionCall(url); // Executed about 50 times, it has to run parallel
}
// Wait for all called functions to finish before next stuff happens and
// write gets called again.
}
for(var foo in bar) {
// Here i parse the json array "foo" which is in the json array "bar"
write(foo[bla]); // bla is an array of multiple urls.
}
异步函数调用看起来像这样:
var request = require('request');
request(url, function (error, response, body) {
if(typeof response !== 'undefined') {
if((response.statusCode >= 400 && response.statusCode <= 451)
|| (response.statusCode >= 500 && response.statusCode <= 511))
return true;
return false;
}
return false;
});
解决方法:
这里最简单的方法是直接或通过async / await语法使用promises.在这种情况下,可能是直接的.
首先,您必须使asyncFunctionCall返回一个promise.看起来你总是返回一个布尔值,所以在这种情况下我们总是会解决这个问题:
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);
}
然后你可以构建一个包含所有承诺的链,这样它们就可以串联运行:
let p = Promise.resolve();
for (let foo in bar) { // <== Notice `let`
// 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]));
});
}
请注意,在该循环中对foo使用let而不是var是很重要的,因为当时的回调会关闭它;请参阅this question’s answers,了解为什么让它发挥作用.
每次调用只会在前一个工作完成时进行.
然后等待整个过程完成:
p.then(() => {
// All done
});
您没有使用来自写入请求的布尔值显示任何内容,但它们可用(作为数组)作为来自写入的promise的解析值.
我们调用write的过程的第二部分也可以用异步函数编写,这可以使逻辑流更清晰:
async function doTheWrites() {
for (let 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
});
…或者如果这也是异步函数:
await doTheWrites();
内容总结
以上是互联网集市为您收集整理的javascript – Node.js – 在继续代码之前等待多个异步调用完成全部内容,希望文章能够帮你解决javascript – Node.js – 在继续代码之前等待多个异步调用完成所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。