只有当链中的所有'当时'已经解决时,才能解决承诺

时间:2016-07-20 13:49:56

标签: javascript node.js promise ecmascript-6

我的印象是,一连串的Promise会回复'那时'链中的最后一个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);
});

代码当前输出

1
a is done running
finally,  undefined
2

只有当链中的所有Promise都已完成时,最底层的履行功能才会运行吗?

如何输出以下内容?

1
2
a is done running
finally,  2

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我认为这只是因为你在第一个(控制台.log(2))中没有Promise ......所以它什么也没有返回,而且这个承诺是“立即”解决的。所以它执行“a is done running”等...然后它记录超时中的内容..希望它有所帮助;)