jQuery Deferred.then - failFilter参数

时间:2015-12-17 10:07:27

标签: javascript jquery promise jquery-deferred

我试图了解jQuery deferred / promises(使用v1.8 +)。

通过阅读文档,$.Deferred.then(...)方法接受doneFilterfailFilter作为参数执行,并返回一个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
    });

两个问题:

  1. 为什么执行链会在doDefer()中停止,如果它遇到第一个fail函数?据我了解,then返回$.Deferred.promise(),这是第二个then函数链接(并执行)的方式。第一个链中的then doneFilter / function / callback总是重写(?) - 那么为什么jQuery以不同的方式处理failFilter
  2. 为什么then会返回$.Deferred.promise(),但done / always / fail等等,请返回$.Deferred?这有什么用(为什么它与then不同?)

3 个答案:

答案 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会返回$.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中被破坏