参见英文答案 >
jQuery.when – Callback for when ALL Deferreds are no longer ‘unresolved’ (either resolved or rejected)? 8个
假设我有一组ajax调用,如下所示:
假设我有一组ajax调用,如下所示:
// an array of ajax calls var callsArray = []; callsArray.push( $.ajax({ url: '/url1'; cache: false,dataType: 'html' }),$.ajax({ url: '/url2'; cache: false,dataType: 'html' }) )
我事先知道这两个电话中至少有一个会失败.我希望在BOTH调用解析成功或失败后执行一个函数,我还想记录任何失败.
这不起作用:
// NOT APPROPRIATE var errors = ''; $.when.apply(null,callsArray) .done(function() { console.log('Both calls completed but these urls Failed: ' + errors); }) .fail(function() { errors += this.url + ' '; })
上面的问题是.fail即使一次调用失败也会执行,而.done仅在零调用失败时执行.此外,我不能使用.always,因为它会在任何调用解析后立即执行.
因此,我正在寻找这样的事情:
// FANTASY CODE var errors = ''; $.when.apply(null,callsArray) .allCallsResolved(function() { // this executes only when all calls have // returned either a success or a failure // rather than when all calls succeed console.log('All calls completed but these urls Failed: ' + errors); }) .everyFailure(function() { // this executes every time a call fails // rather than as soon as any call fails errors += this.url + ' '; })
解决方法
您可以将每个ajax调用包装在一个解决成功和失败的Promise中,然后使用
Promise.all
来验证所有调用是否已完成和/或失败:
const promises = callsArray.map(function(call) { return new Promise(function(resolve,reject) { call.done(resolve).fail(function(error) { console.log(error); resolve(error); }); }); }); Promise.all(promises).then(function(values) { console.log(values); //all calls done or Failed });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。