在'Promise`和`then()`执行顺序上

时间:2017-01-09 23:04:34

标签: javascript promise es6-promise

我们说我有这样的功能

const fn = () => {
    return work()
    .then((finalResult) => {     // then 1
        finish(finalResult);
    });
};


const work = () => {
    return Promise.resolve(1)
    .then(() => {                // then 2
        return process1();
    }).then((result) => {        // then 3
        return process2(result);
    });
};

我的问题是:我可以依赖finish process1process2后调用的事实。具体而言,then 1附加的承诺是Promise.resolve(1),还是附加到then 3返回的承诺。

2 个答案:

答案 0 :(得分:1)

这首先是语法问题。你在做什么等同于

const fn = () => {
    const promiseA = work();
    const promiseB = promiseA.then(finish); // then 1
    return promiseB;
};

const work = () => {
    const promiseC = Promise.resolve(1);
    const promiseD = promiseC.then(process1); // then 2
    const promiseE = promiseD.then(process2); // then 3
    return promiseE;
};

只是介绍一些额外的变量(我也简化了函数表达式)。

现在我们可以清楚地看到work()的结果是它返回的结果,所以promiseA === promiseE。所以是的,finish被链接到" then3"的结果。调用

知道then创建了新的承诺(针对回调的最终结果)而不是返回原始承诺,我们也可以得出结论promiseE !== promiseC,因此finish 链接到Promise.resolve(1)

答案 1 :(得分:0)

每个then将等待其先前的承诺,然后依次运行。

如果前面的promise返回一个值,传递给回调的参数将是该值,或者如果它返回另一个promise,则回调的参数将是该promise的返回值。

承诺加上规范的

Section 2.2.6.1声明:

  

如果/当履行承诺时,所有相应的onFulfilled回调必须按其原始呼叫的顺序执行。

保证finish(finalResult)将以process2(result)的结果运行(当然,除非出现错误。)

我发现this article对于掌握承诺的胆量非常有启发性。