试图打破用。于是,.fail和.reject jQuery的承诺链(attempting to br

2019-07-31 05:40发布

更新:这个问题是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没有影响。

Answer 1:

你是不是重新定义的价值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增加了新的功能,更可能他们只是没有做更新的文档。



Answer 2:

恕我直言,你没有任何链接。 你的第二个.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();


文章来源: attempting to break jQuery promise chain with .then, .fail and .reject