Javascript 当承诺时,如何处理美元的失败?

Javascript 当承诺时,如何处理美元的失败?,javascript,jquery,ajax,promise,deferred,Javascript,Jquery,Ajax,Promise,Deferred,我不明白在传递多个AJAX调用时,在失败期间是如何工作的。如果其中一个失败,是否会触发失败回调?另外,fail的参数是什么,每个ajax一个,还是为所有人共享一个fail $.when( $.ajax('/url1'), $.ajax('/url2')) .done(function (resp1, resp2) { }).fail(function (??) { }); 这应该很容易检查,对吗 var d1 = $.Deferred(), d2 =

我不明白在传递多个AJAX调用时,在失败期间是如何工作的。如果其中一个失败,是否会触发失败回调?另外,fail的参数是什么,每个ajax一个,还是为所有人共享一个fail

$.when(
    $.ajax('/url1'),
    $.ajax('/url2'))
   .done(function (resp1, resp2) {

    }).fail(function (??) {

    });

这应该很容易检查,对吗

var d1 = $.Deferred(), d2 = $.Deferred();

$.when(d1, d2)
   .fail(function (a, b) { 
      console.log(a, b); 
   });

d2.reject("hi!");
输出为
hi!未定义
。所以只有一个参数通过


当任何承诺被拒绝时,将调用最终失败。 如果你想为每个人做一些不同的事情,你可以尝试以下方式:

$.when(
    $.ajax('/url1').fail(function () { console.dir('fail 1'); }),
    $.ajax('/url2').fail(function () { console.dir('fail 2'); }))
.done(function (resp1, resp2) {

}).fail(function () {
    console.dir('fail any');
});
Fail any将在一个ajax请求失败后立即调用,因此之后可能会调用其他特定于请求的fails。

。然后()
实际上最多使用三个参数(success、Fail、progress)。您可以使用其他答案中提到的
.fail()
,也可以执行以下操作:

$.when(async).then(function success(resp) {
        console.log('success');
    }, function fail(resp) {
        console.log('fail');
    });

我正在做一些类似的事情,我认为这可能会对某些人有所帮助


如果一个延迟失败,那么包装$.when也会立即失败。这是有道理的,但是在失败中,我如何知道哪一个失败了呢?每个AJAX调用是否有一个fail参数,或者在单个fail参数中是否有一个fail参数?如果有一个失败,则包装
$。当
的fail立即被调用时,参数将是第一个
$。AJAX
失败,因为此时将调用外部
fail()
,有道理吗?这正是阿德亚诺对第一次失败所说的。如果你想知道所有的失败,而不仅仅是第一个,那么为每个
$.ajax()
承诺分别设置
.fail()
处理程序。你真的不需要测试它,很明显如果外部
失败()
附加到
$。如果
$中的一个延迟被拒绝,则立即调用
。当
被拒绝,即ajax失败时,参数将仅从失败的ajax调用中传递,因为无法保证其他ajax调用将完成,并且会立即调用外部的
fail()
,所以没有办法传递任何其他信息。
当(d1,d2).done(函数(a,b){})有两个参数时。解决这个问题的一种方法是要求:
when_array([d1,d2]).done(spread(function(A,b){}))
。根据我使用jQuery的经验,它们有一些非常好的、但有点随意的语法糖。
 var d1 = $.Deferred().fail(function(a){ console.log('on fail 1', a) }), 
    d2 = $.Deferred().fail(function(a){ console.log('on fail 2', a) }),
    d3 = $.Deferred().fail(function(a){ console.log('on fail 3', a) });
$.when(d1, d2, d3)
.then(function (a, b, c){
  console.log('then: ', a, b, c);
})
.fail(function (a, b, c) { 
  // only reports the first one that failed
  console.log('fail: ', a, b, c); 
})
.always(function(a, b, c){
  console.log('always: ', a, b, c);
});
d1.resolve("d1!");
d2.reject("d2!");
d3.reject("d3!");
'use strict';
var getConfigRequestDef = $.Deferred();
var getConfigDef = $.Deferred();
var getStatusRequestDef = $.Deferred();
var getStatusDef = $.Deferred();
getConfigRequestDef.then(function (cfg) {
    return getConfigDef.resolve(cfg);
}, function (c) {
    c.hasError = true;
    getConfigDef.resolve(c);
});
getStatusRequestDef.then(function (status) {
    return getStatusDef.resolve(status);
}, function (s) {
    s.hasError = true;
    getStatusDef.resolve(s);
});
var results = $.when(getConfigDef, getStatusDef).then(function (config, status) {
    console.log('The when\'s then: ', JSON.stringify(config), JSON.stringify(status));
});
var cfg = {
    id: 10,
    type: 'config',
    hasError: false
};
var statusObj = {
    id: 30,
    type: 'status',
    hasError: false
};
getConfigRequestDef.reject(cfg);
getStatusRequestDef.reject(statusObj);