Javascript 如何在循环中链接承诺,并等待所有循环的完成?
我在一个对象上迭代,每次迭代都执行一个ajax调用。 我需要:Javascript 如何在循环中链接承诺,并等待所有循环的完成?,javascript,loops,promise,Javascript,Loops,Promise,我在一个对象上迭代,每次迭代都执行一个ajax调用。 我需要: 按顺序执行ajax调用 只有在完成所有ajax调用后才执行某些操作 我能够分别实现上述每一个目标,但不能同时实现这两个目标 下面是我的代码的简化版本 使用承诺。将与承诺一起推。所有都实现了等待循环完成的目标 使用return my\u ajax\u fn()(在下面的代码中注释掉)可以实现按顺序执行调用的目标 但我如何实现这两个目标呢 function my_ajax_fn(index, value){ return $.a
承诺。将与承诺一起推。所有都实现了等待循环完成的目标
使用return my\u ajax\u fn()
(在下面的代码中注释掉)可以实现按顺序执行调用的目标
但我如何实现这两个目标呢
function my_ajax_fn(index, value){
return $.ajax({
url: site_url,
type: "POST",
success: function(data) {
// do some stuff
}});
}
function test_done() {
var promises = [];
for (const [index, value] of Object.entries(answers)){
if (index!=0) {
p1 = p1.then(function() {
promises.push(my_ajax_fn(index, value));
// return my_ajax_fn(index, value);
});
};
};
Promise.all(promises)
.then(() => {
// do stuff after all the ajax calls are done
})
.catch((e) => {
// handle errors here
});
}
您可以通过在回调中返回承诺来链接承诺:
p1 = p1.then(()=>my_ajax_fn(index_value))
这会导致承诺链接到返回的承诺上,这是由my\u ajax\u fn()返回的承诺
也考虑使用语法。语法可以写成:
异步函数testDone(){}
和等待my_ajax_fn()
允许类似于编写同步代码的语法,该语法更简洁、更易于阅读和理解,并且通常比。对一系列异步操作进行排序的最简单方法是使用async/await
。这也将使我们很容易知道他们何时完成:
async function test_done() {
for (const [index, value] of Object.entries(answers)){
if (index != 0) {
await my_ajax_fn(index, value);
}
}
console.log("all done now");
}
从该函数的外部,它返回一个承诺,以便您可以使用该承诺来知道何时完成:
test_done().then(() => {
console.log("all done");
}).catch(err => {
console.log(err);
});
因此,如果我声明async function testDone(){}
并在其中使用for await
而不是for
,那么写在循环下面的任何代码都将等待循环完成后再执行?它将等待等待之后的承诺(或异步)得到解决,然后再继续。for await of将在从iterable返回的每个Promise/async上等待,在的之后。比如迭代承诺(或异步)。