承诺链示例不起作用

2 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)
    });


});
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 9

当你调用.then一个promise时,它会返回一个新的promise,它会从你返回的值中解析出来.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);
});
Run Code Online (Sandbox Code Playgroud)

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

Promise<A> -> (A -> (Promise<B> | B)) -> Promise<B>
Run Code Online (Sandbox Code Playgroud)

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

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

JS中的一个承诺是对链接本身的抽象.像其他同类产品一样 - 它抽象排序,想象then一个分号.

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