javascript - promise 链示例不起作用

标签 javascript jquery promise

我想了解 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)
    });


});

最佳答案

当您对 Promise 调用 .then 时,它会返回一个新的 Promise,该 Promise 会使用您从 .then 返回的值进行解析。

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

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);
});
<小时/>

Promise 链起作用的原因是 .then 的工作方式,它作为函数的签名有点复杂,但当你掌握它时就有意义了:

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

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

  • 它是一个对 Promise 进行操作的函数(作为 this 隐式提供)。在我们的例子中,这就是 doSomething 返回的 promise 。
  • 它需要一个回调来处理展开的值:promise 解析的结果。它返回一个新类型值的 promise (或者在我们的例子中只是一个值)。在我们的例子中,该值为 1。因此我们有一个 Promise,并用 1 来解析它。
  • 它返回一个关于我们的 then 将解析的值的 promise - 这就是链接发生的原因。对其调用 .then - 我们提供了一个接受 1 作为参数并返回 2 的函数。因此我们有一个 1 -> 2。这返回了值 2 的 promise 。

JS 中的 Promise 是对链接本身的抽象。与其他同类产品一样 - 它抽象了排序,将then想象成一个分号。

这实际上就是为什么 Promise 如此有用 - 你异步 Hook ,就像你从 then 返回 2 一样,你可以返回一个 $.ajax 调用,然后仅当 ajax 调用完成时才会发生链。

关于javascript - promise 链示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26971617/

相关文章:

javascript - 是否可以从粘贴在文本区域的 html 页面中找到此类标签​​,并将其标签替换为 javascript 代码中提到的其他标签?

jquery - 从blur()调用实际函数

javascript - 如何让另一个函数解析 jquery 延迟的函数式编程

javascript - 如何在 Node 中运行两个查询并将它们传递给渲染函数?

javascript - 在 if 语句上使用 Promises

javascript优秀导出blob问题

javascript - javascript中的命名空间实现

javascript - 从 WCF 服务调用 HTML 函数

javascript - JQuery如果下一个元素是最后一个元素隐藏另一个元素

javascript - Angularjs 从 url 获取 Json