仅当链中的所有“then”都已解决时,做出 Promise 才会解决

use*_*077 1 javascript node.js promise ecmascript-6

我的印象是,一系列 Promise 返回“then”链中的最后一个 Promise。然而,当我测试以下内容时,情况似乎并非如此:

function a() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log('1');
            resolve(1);
        }, 1000);
    }).then((num) => {
        setTimeout(function() {
            console.log('2');
            return 2;
        }, 1000);
    });
}

a().then((num) => {
    console.log('a is done running');
    console.log('finally, ', num);
});
Run Code Online (Sandbox Code Playgroud)

目前代码输出

1
a is done running
finally,  undefined
2
Run Code Online (Sandbox Code Playgroud)

最底层的履行函数不应该仅在链中的所有 Promise 完成时才运行吗?

我怎样才能让它输出以下内容?

1
2
a is done running
finally,  2
Run Code Online (Sandbox Code Playgroud)

Jua*_*iza 5

您可以通过实际返回一个新的承诺来做到这一点:

function a() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log('1');
            resolve(1);
        }, 1000);
    }).then((num) => {
        return new Promise((resolve) => {
          setTimeout(function() {
              console.log('2');
              return resolve(2);
          }, 1000);
        })
    });
}

// the "then" here actually comes from the second promise.
a().then((num) => {
    console.log('a is done running');
    console.log('finally, ', num);
});
Run Code Online (Sandbox Code Playgroud)