尝试用.then,.fail和.reject打破jQuery承诺链

And*_*Ray 12 jquery promise chain deferred

更新:此问题是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();
Run Code Online (Sandbox Code Playgroud)

预期:'我应该被称为'

实际:'我永远不应该被称为'

问题:我想链接回调并让其中任何一个能够打破链并触发该fail函数,并跳过其他链式回调.我不明白为什么所有的游戏都被触发并且未触发失败.

我来自NodeJS的Q库,所以我先尝试了.then.但是,将其更改为.pipe无效.

use*_*654 11

你没有重新定义它的价值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();
Run Code Online (Sandbox Code Playgroud)

显然它确实以你认为的方式工作,它只是没有记录 https://api.jquery.com/deferred.then.很酷.这是jQuery 1.8.0中添加的新功能,很可能他们没有完成更新文档.