【发布时间】:2018-11-20 21:55:41
【问题描述】:
我有一个动态的 API 调用数组需要出去。但是,jQuery 的 $.when 似乎并没有等待承诺解决或被拒绝,或者我不明白如何正确使用承诺。
代码
function addEntry(data) {
return new Promise(function(resolve, reject) {
_customAPIClass_.post('some/url/path', data)
.done(function(){
console.log('resolving');
resolve(1000)
})
.catch(function(){
console.log('rejecting');
reject(2000);
})
});
}
let deferreds = [];
$.each(form.find(el), function(i, element) {
let data = {
id: $(element).find('.id').val(),
name: $(element).find('.name').val()
}
deferreds.push(addEntry(data));
}
if (deferreds.length) {
$.when.apply(deferreds).then(function(data){
console.log('All done', data)
}, function(err){
console.log('error', err);
});
}
控制台输出 在 .then() 执行后,两个 api 调用拒绝了 Promise
所以,我不明白的是,Stack Overflow 或 jQuery 文档上的其他问题没有帮助我解决,为什么 .then() 在 API 调用完成之前表现得好像一切正常并解决或拒绝了他们的承诺?在进行所有 API 调用后,我如何处理解析或拒绝,还是我误解了 .when() 和承诺的目的?
【问题讨论】:
-
您的
.apply似乎遗漏了一些非常重要的东西。 (需要两个参数) -
您使用 .apply 而不仅仅是直接调用 .when() 的任何特殊原因?有关使用示例,请参阅 api.jquery.com/jquery.when。另请注意,它仍然不会等待所有必要的事情完成 - 一旦任何承诺被拒绝,它就会触发回调。
-
@ADyson 因为 $.when 不接受数组。
-
啊,对不起,我错过了。
-
在这种情况下:Pass in an array of Deferreds to $.when()可能重复
标签: javascript jquery promise