Javascript 只有在所有';然后';链中的问题已解决

Javascript 只有在所有';然后';链中的问题已解决,javascript,node.js,promise,ecmascript-6,Javascript,Node.js,Promise,Ecmascript 6,我的印象是,一系列承诺会回报“then”系列中的最后一个承诺。但是,当我测试以下各项时,情况似乎并非如此: function a() { return new Promise(function(resolve, reject) { setTimeout(function() { console.log('1'); resolve(1); }, 1000); }).then((num) => {

我的印象是,一系列承诺会回报“then”系列中的最后一个承诺。但是,当我测试以下各项时,情况似乎并非如此:

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
难道最底层的履行功能不应该只在链中的所有承诺都完成时才运行吗

我如何让它输出以下内容

1
2
a is done running
finally,  2

您可以通过实际返回新承诺来实现这一点:

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

您可以通过实际返回新承诺来实现这一点:

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

我认为这只是因为你在第一阶段没有承诺,然后(在你控制台的那一阶段,log(2))。。。因此,它不返回任何内容,承诺“立即”得到解决。所以它执行“a完成运行”等。。。然后它会记录超时时发生的情况。。希望有帮助;)

我认为这只是因为你在第一阶段没有承诺,然后(在你控制台的那一阶段,log(2))。。。因此,它不返回任何内容,承诺“立即”得到解决。所以它执行“a完成运行”等。。。然后它会记录超时时发生的情况。。希望有帮助;)

你想
Promise.All()
我相信:-创建你所有的承诺,并将它们作为数组传递给Promise.All()首先超时,然后就不会按照你的想法执行。如您所见,该代码的结果将是一个解析值
undefined
,因为
setTimeout
中的
return 2
部分实际上不返回任何内容,所以您将得到undefined。第二个
中的箭头函数必须返回一个承诺。当您运行
a()
时,它实际上正在运行其内部的承诺,但不返回任何内容。@Darren
promise。所有
都将同时运行承诺。问题似乎是希望承诺按顺序运行。@JuanStiza我看到一些示例在“then”而不是承诺中返回值。为什么它在这里不起作用?是不是只有在链的下面有一个额外的“then”呢?你想要
Promise.All()
我相信:-创建你所有的承诺,并将它们作为数组传递给Promise.All()首先超时,然后就不会按照你的想法做了。如您所见,该代码的结果将是一个解析值
undefined
,因为
setTimeout
中的
return 2
部分实际上不返回任何内容,所以您将得到undefined。第二个
中的箭头函数必须返回一个承诺。当您运行
a()
时,它实际上正在运行其内部的承诺,但不返回任何内容。@Darren
promise。所有
都将同时运行承诺。问题似乎是希望承诺按顺序运行。@JuanStiza我看到一些示例在“then”而不是承诺中返回值。为什么它在这里不起作用?是否只有在链的下游有一个额外的“then”?