我试图了解jQuery deferred / promises(使用v1.8 +)。
通过阅读文档,$.Deferred.then(...)
方法接受doneFilter
和failFilter
作为参数执行,并返回一个promise,我们可以使用它来链接如下: / p>
function doDefer() {
var $defer = $.Deferred();
doSomethingAsynchronous(
function () {
$defer.resolve();
},
function () {
$defer.reject();
}
);
return $defer.promise();
}
doDefer()
.then(function () {
return;
}, function () {
// second `then` not called
})
.then(function (b) {
// `b` is undefined, since first `then` returned without a value.
}, function () {
// fail end
});
两个问题:
doDefer()
中停止,如果它遇到第一个fail
函数?据我了解,then
返回$.Deferred.promise()
,这是第二个then
函数链接(并执行)的方式。第一个链中的then
doneFilter / function / callback总是重写(?) - 那么为什么jQuery以不同的方式处理failFilter
?then
会返回$.Deferred.promise()
,但done
/ always
/ fail
等等,请返回$.Deferred
?这有什么用(为什么它与then
不同?)答案 0 :(得分:0)
你可以看到这个例子,它的工作正确:
function doDefer() {
var $defer = $.Deferred();
setTimeout( function(){
doSomethingAsynchronous(
function ( value ) {
// func1 - value is a random number
$defer.resolve( value );
},
function () {
$defer.reject();
}
);
}, 1000 );
return $defer.promise();
}
function doSomethingAsynchronous( func1, func2 ){
// random number 0-10
var random = Math.round( Math.random()*10 )
if( random > 5 ){
return func1.call( this, random );
}else{
return func2.call( this );
}
}
doDefer().then(function ( value ) {
// success
// make double of random
return value*2;
}, function () {
// fail when random number < 5
})
.then(function (b) {
// `b` is double of random number
console.log(b);
}, function () {
// fail end
});
我希望这可以帮到你
答案 1 :(得分:0)
为什么执行链会在
doDefer()
停止,如果它遇到第一个fail
函数?据我所知,then
返回一个承诺,即第二个then
函数被链接(并执行)的方式。第一个链中then
完成的回调总是重写(?) - 那么为什么jQuery以不同的方式处理failFilter
?
我不确定我是否理解你,但你应该知道两件事:
then(done, fail)
只执行其中一个回调,具体取决于它们被链接的承诺是履行还是被拒绝。.then(…)
调用返回的承诺不符合Promises/A+ compliant。等待jQuery 3.0,使用正确的promise库(on top of it),或者学会使用它。为什么
then
会返回$.Deferred.promise()
因为它是一个承诺,将通过相应的回调结果解决。你不能自己解决这个问题。另请参阅What are the differences between Deferred, Promise and Future in JavaScript?
...但是
done
/always
/fail
等等返回$.Deferred
?
他们没有。他们只是返回他们被调用的对象,无论是承诺还是延期。
答案 2 :(得分:0)
failHandler
会像你说的那样停止执行。关键是看链。只有在被链接的Promise被拒绝时才会执行失败处理程序。确保您将链中的每个链接视为单独的承诺。
链接可以改写如下。
dfd1 = doDefer();
dfd2 = dfd1.then( success1, fail1 );
dfd3 = dfd2.then( success2, fail2 );
在此示例中,success1
仅在dfd1
解析后才会被调用。如果它被拒绝,则会调用fail1
而链将停止。
同样,success2
只有在解析dfd2
时才会被调用(换句话说,success1
会返回一个值或解析返回的保证)。执行fail2
的唯一方法是,dfd2
明确拒绝success1
(错误冒泡在jQuery的实现中不起作用)。
tl; dr - 失败不链接,正如@Bergi所说,错误处理在jQuery中被破坏