我有一个包含N个html选择的页面。我有一个名为'run_all_ajax'的函数,它循环遍历它们并调用一个填充它们的ajax函数。我希望只有当Promise.all在其中完成时才从run_all_ajax返回。
现在,控制台读取;
全部完成,0
毕竟完成了
0,1,2,3等
意味着在我添加到promises数组之前,promise.all正在解析。我该如何纠正?
另外,我想了解承诺数组如何在时间方面起作用。我们是否假设我们可以遍历选择数组并将它们添加到promises数组中,而不是使用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');
})
你push
在错误的地方(时间)承诺。没有必要创建一个new Promise
。您需要的承诺由$.ajax()
返回。
所以:
promises.push($.ajax({
//stuff
}));
在请求完成时调用promises.push
,这是在执行Promise.all
之后的方式。
基本上你打电话给Promise.all([])
立即解决。
这个
new Promise(function (resolve, reject) { resolve("Complete"); })
也立即解决。它等于Promise.resolve("Complete")