jQuery Deferred / Promises

时间:2017-05-03 19:11:43

标签: javascript jquery promise deferred

我试图了解Promise如何使用jQuery。 这是我的沙箱:

    function test1() {
        var deferred = $.Deferred()
        setTimeout(function() {
             deferred.resolve(1);
             //deferred.reject(2);
        }, 2000);
        return deferred.promise();
    }

    function test2() { 
        var deferred = $.Deferred()
        setTimeout(function() {
             deferred.resolve(2);
            // deferred.reject(2);
        }, 1000); 
        return deferred.promise();
    }

    function doTest(){
        $.when(test1()).then(
            function (a) {
                console.log('test1 finished', a)
                return test2();
            },
            function (a) {
                console.log('something failed in test1', a)
            }
        ).then(
            function (b) {
                console.log("test2 finished", b);
            },
            function (b) {
                console.log("something failed in test1", b);
            }
        );
    }       

它按照我的预期工作 - 写作:

  

test1完成1

     

test2完成了2

但是当我改变它时如下:

        function test1() {
        var deferred = $.Deferred()
        setTimeout(function() {
            // deferred.resolve(1);
             deferred.reject(2);
        }, 2000);
        return deferred.promise();
    }

    function test2() { 
        var deferred = $.Deferred()
        setTimeout(function() {
             deferred.resolve(2);
            // deferred.reject(2);
        }, 1000); 
        return deferred.promise();
    }

它写入控制台:

  

test1 2中的某些内容失败

     

test2完成未定义

什么是不正确的,因为test2还没有被执行。

我希望," test2完成未定义"不应该显示。

我猜第二次出现问题,但是什么?

1 个答案:

答案 0 :(得分:0)

您的问题实际上在第一个then的onRejected函数中。具体来说,因为你“返回”一个值" (未定义),然后链中的下一个then处理程序将其视为履行承诺。

    $.when(test1()).then(
        function (a) {
            console.log('test1 finished', a)
            return test2();
        },
        function (a) {
            console.log('something failed in test1', a)
            // Your problem is here.
        }
    ).then(
        function (b) {
            console.log("test2 finished", b);
        },
        function (b) {
            console.log("something failed in test1", b);
        }
    );

在某些情况下,这可能很有用:

$.when(riskyFunction()).then(
  function (value) {
    return processValue(value);
  }, function (error) {
    console.log(error);
    return defaultValue;          // This lets you recover...
  }).then(function (value2) {
    return processValue2(value2); // so this handler runs regardless of
                                  // riskyFunction's return value.
  });

与同步代码相比,它匹配一个狭窄的try块:

try {
  a = test1();
  b = test2();
} catch (e) {
  console.log('something failed in test1', a)
}
console.log("test2 finished", b);  // this runs even if test1 or test2 fails,
                                   // but in those cases b is undefined!

相反,您应该删除错误处理程序并在最后或至少return $.reject(a)throw a捕获错误,以便继续关注then处理程序中的错误链。