Javascript 当承诺时,如何处理美元的失败?
我不明白在传递多个AJAX调用时,在失败期间是如何工作的。如果其中一个失败,是否会触发失败回调?另外,fail的参数是什么,每个ajax一个,还是为所有人共享一个failJavascript 当承诺时,如何处理美元的失败?,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 =
$.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);