我有一个包含N个html选择的页面。我有一个名为“ run_all_ajax”的函数,该函数遍历它们并调用填充它们的ajax函数。我希望仅当Promise.all在其中完成时才能从run_all_ajax返回。
现在,控制台读取;
全部完成,0
毕竟完成
0,1,2,3等
意味着promise.all在我添加到promises数组之前就已经解决了。我该如何纠正?
此外,我想了解按时间顺序排列的诺言如何工作。我们是否假设我们可以遍历选择数组并将其添加到Promise数组中,比使用Promise.all()解决所有未完成的Promise更快?
function run_all_ajax() {
return new Promise(function (resolve, reject) {
var promises = [];
$("[selectgrid]").each(function (i, obj) {
$.ajax({
//stuff
success: function (response) {
//stuff
console.log(i);
}, //end: success
complete: function (jqXHR, textStatus) {//
promises.push(new Promise(function (resolve, reject) { resolve("Complete"); }));
}
}); //end: $.ajax
});
Promise.all(promises).then(function (values) {
console.log('all done, ' + promises.length);
resolve("Complete");
});
}); //end promise
}
run_all_ajax().then(function(){
console.log('after all done');
})
答案 0 :(得分:1)
您push
在错误的位置(时间)做出了承诺。无需创建new Promise
。 $.ajax()
返回了您需要的承诺。
也是这样:
promises.push($.ajax({
//stuff
}));
答案 1 :(得分:0)
promises.push
是在完成Promise.all
之后的请求完成时调用的。
基本上,您正在呼叫Promise.all([])
,它会立即解决。
此
new Promise(function (resolve, reject) { resolve("Complete"); })
也会立即解决。等于Promise.resolve("Complete")