承诺链示例不起作用

时间:2014-11-17 11:23:01

标签: javascript jquery promise

我想了解承诺链接,我尝试按顺序从1到3调用以下函数,目前它没有工作,所以我在这里缺少什么?

$(function () {
    function doSomething() {
        return new Promise(function (resolve) {
            var value = 1;
            resolve(value);
        });
    }


    function doSomething2(){
        return 2;
    };

    function doSomething3(){
        return 3;
    };


    doSomething().then(function (firstResult) {

        var result = "first result " + firstResult;
        alert(result);

    })doSomething2.then(function (secondResult) {
        var secReslut = "second result " + secondResult;
       return alert(secReslut);
    })()doSomething2.then(function (tr)
    {
      alert(tr)
    });


});

1 个答案:

答案 0 :(得分:9)

当您在承诺上调用.then时,它会返回一个新承诺,该承诺将使用您从.then返回的值进行解析。

因此,在您的示例中链接承诺的正确方法是:

doSomething().then(function(firstResult){
     alert(firstResult);
     return doSomething2(); // this could also return a promise over an async value
}).then(function(secondResult){
     alert(secondResult); // alerts 2
     return doSomething3();  
}).then(function(thirdResult){
     alert(result(3);
});

链接起作用的原因是因为.then如何工作,它作为一个函数的签名有点复杂,但是当你掌握它时才有意义:

Promise<A> -> (A -> (Promise<B> | B)) -> Promise<B>

这看起来很复杂,但让我们分析一下:

  • 这是一个在Promise上运行的函数(隐式提供为this)。在我们的情况下,承诺doSomething返回。
  • 它需要一个对未解包的值起作用的回调:承诺解决了什么。它返回一个新类型值的承诺(或者只是我们案例中的值)。在我们的例子中,该值为1.所以我们有一个Promise,我们用1解决它。
  • 它会在我们then将解决的值上返回一个promise本身 - 这就是链接发生的原因。在它上面调用.then - 我们提供了一个函数,它接受1作为参数并返回2.所以我们有一个1 - &gt;这回复了对价值2的承诺。

JS中的一个承诺是对链接本身的抽象。像其他类似的一样 - 它抽象排序,将then想象成分号。

这实际上是为什么promises非常有用 - 你异步挂钩,就像你从then返回2一样,你可以返回一个$.ajax调用,而链只会在ajax调用时发生完成。