更新:这个问题是jQuery的1.7 VS 1.8的结果。 千万不要使用1.7的承诺怎么一回事,因为它们不与返回内一个承诺可链接的.then
。 1.8看起来他们没搞砸了。
http://jsfiddle.net/delvarworld/28TDM/
// make a promise
var deferred = $.Deferred();
promise = deferred.promise();
// return a promise, that after 1 second, is rejected
promise.then(function(){
var t = $.Deferred();
setTimeout(function() {
console.log('rejecting...');
t.reject();
}, 1000);
return t.promise();
});
// if that promise is successful, do this
promise.then(function() {
console.log('i should never be called');
})
// if it errors, do this
promise.fail(function() {
console.log('i should be called');
});
deferred.resolve();
预计:“我应该叫”
实际:“我不应该叫”
问题 :我想链回调,让他们中的任何一个能够打破链和触发fail
功能,并跳过其他链接的回调。 我不明白为什么所有的thens的触发和故障不会被触发。
我是从的NodeJS Q值来图书馆,所以我试了一下.then
第一。 然而,将其更改为.pipe
没有影响。
你是不是重新定义的价值promise
,试试这个:
http://jsfiddle.net/28TDM/1/
var deferred = $.Deferred();
promise = deferred.promise();
promise = promise.then(function(){
var t = $.Deferred();
setTimeout(function() {
console.log('rejecting...');
t.reject();
}, 1000);
return t.promise();
});
promise.then(function() {
console.log('i should never be called');
})
promise.fail(function() {
console.log('i should be called');
});
deferred.resolve();
显然,它不工作,你认为它做的方式, 它只是不记录 https://api.jquery.com/deferred.then 。 很酷。 这是jQuery的1.8.0增加了新的功能,更可能他们只是没有做更新的文档。
恕我直言,你没有任何链接。 你的第二个.then
连接到作为第一同样的承诺.then
连接到 。
为什么?
请注意, then
将总是返回新的承诺,而不是改变它附着在承诺。 它没有副作用。
例如:
var promiseX = promiseA
.then(function() { return promiseB; })
promiseX.then(function() { return promiseC; });
promiseA
不会改变被附接后其值 then
; 它会保持原样。
promiseX
将是第一个返回值, then
,就是promiseB
。
所以第二个then
实际上是附着于promiseB
。
而这正是@Kevin的B他的回答一样。
另一种方案是,因为.then
将返回新的承诺,你可以链.then
功能,如下面。
var promiseX = promiseA
.then(function() { return promiseB; })
.then(function() { return promiseC; });
这一次,第一次then
是连接到promiseA
,猜猜哪个是诺二号then
附着到?
你是对的。 这promiseB
,不promiseA
。 由于第二个then
实际上是附着在1日的返回值then
,即promiseB
。
最后第二次then
的返回值分配给promiseX
,所以promiseX
等于promiseC
。
好了,回到了OP的问题。 下面的代码是我的答案。
var deferred = $.Deferred();
promise = deferred.promise(); // this is the first promise
promise.then(function(){ // callbacks for 1st promise
var t = $.Deferred();
setTimeout(function() {
console.log('rejecting...');
t.reject();
}, 1000);
return t.promise(); // this is the 2nd promise
// return $.Deferred().reject(); // To reject immediately.
}).then(function() { // callbacks for 2nd promise
console.log('i should never be called');
}, function() {
console.log('i should be called');
})
deferred.resolve();