微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 多个异步ajax调用:即使有些失败,如何在所有调用解析后执行函数?

参见英文答案 > jQuery.when – Callback for when ALL Deferreds are no longer ‘unresolved’ (either resolved or rejected)?                                    8个
假设我有一组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] 举报,一经查实,本站将立刻删除。

相关推荐