ES6 JavaScript 中的顺序承诺不起作用

Sequential promises in ES6 JavaScript aren't working

我正在尝试理解 es6 Promises。据我了解,它们可以链接起来按顺序执行。它不适用于个别情况。

console.log("Started");

function doStuff(num, timeout) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log("now " + num);
            resolve();
        }, timeout);
    });
}

doStuff(1, 3000).then(doStuff(2, 2000)).then(doStuff(3, 1000));

然而输出是:

$ node test
Started
now 3
now 2
now 1

我期待相反的顺序。我明白为什么会变成这样,他们都排队并按 "reverse" 顺序完成。

但问题是,我认为第二个直到第一个完成后才执行,依此类推。我错过了什么?

如果你这样写,对doStuff的3次调用将在你写这行时开始。你必须这样写:

doStuff(1, 3000).then(function() {
    return doStuff(2, 2000);
}).then(function() {
    return doStuff(3, 3000);
});

正如loganfsmyth所说,你是在做ES6,你也可以使用箭头函数:

doStuff(1, 3000).then(() => doStuff(2, 2000)).then(() => doStuff(3, 3000));

是不是打错了?您应该将 then 部分链接到 doStuff 调用,也许像这样:

doStuff(1, 3000).then(function(){
    doStuff(2, 2000).then(function(){
        doStuff(3, 1000);
    });
});

javascript 中的超时是异步的。按照你现在的写法,所有三个 promise 都是按顺序执行的,超时函数只是在一定时间后将其中的代码排队到 运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被认为是 "done"。这就是为什么第二个和第三个承诺不必等待行 "console.log("now " + num);"在开始之前执行。

有关 js 中异步任务的一些背景知识,请参阅此答案 。