【发布时间】:2012-08-22 09:56:12
【问题描述】:
更新:这个问题是 jQuery 1.7 vs 1.8 的结果。永远不要在 1.7 中使用 Promise,因为它们不能通过在 .then 中返回 Promise 进行链接。 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都被触发而fail没有被触发。
我来自 NodeJS 的 Q 库,所以我先用.then 进行了尝试。但是,将其更改为.pipe 没有任何效果。
【问题讨论】:
-
从
.then()返回t没有任何作用。拒绝t也不会以任何方式影响原始延迟对象。来自.then的回调直到它们应用到的延迟对象被解析或拒绝后才会被调用。一旦被解决或拒绝,就不能再次被拒绝或解决。 -
为了更容易理解,请将
.then替换为.done,因为在您的情况下,它们的作用完全相同。 -
我相信至少在 Q 中,在
then中返回一个承诺会将其添加到链中。否则链接的正确方法是什么? -
相关:Problems inherent to jQuery $.Deferred,尤其是当你带着 Q 的期望而来时。
标签: jquery deferred chain promise