Ecmascript 6 ES6 JavaScript中的顺序承诺不是';行不通

Ecmascript 6 ES6 JavaScript中的顺序承诺不是';行不通,ecmascript-6,es6-promise,Ecmascript 6,Es6 Promise,我正在努力理解es6的承诺。据我所知,它们可以链接起来按顺序执行。它在案例中不起作用 console.log("Started"); function doStuff(num, timeout) { return new Promise(function(resolve, reject) { setTimeout(function() { console.log("now " + num); resolve();

我正在努力理解es6的承诺。据我所知,它们可以链接起来按顺序执行。它在案例中不起作用

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
我正期待着相反的顺序。我明白为什么会这样,他们都排着队,以“相反”的顺序结束


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

如果你这样写,当你写这行时,对
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));

如果您这样编写,那么在您编写该行时,将启动对
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));

如果您这样编写,那么在您编写该行时,将启动对
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));

如果您这样编写,那么在您编写该行时,将启动对
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(13000)。然后(函数(){
doStuff(22000)。然后(函数(){
多斯塔夫(31000);
});
});

没有打字错误吗?您应该将then部分链接到doStuff调用,可能如下所示:

doStuff(13000)。然后(函数(){
doStuff(22000)。然后(函数(){
多斯塔夫(31000);
});
});

没有打字错误吗?您应该将then部分链接到doStuff调用,可能如下所示:

doStuff(13000)。然后(函数(){
doStuff(22000)。然后(函数(){
多斯塔夫(31000);
});
});

没有打字错误吗?您应该将then部分链接到doStuff调用,可能如下所示:

doStuff(13000)。然后(函数(){
doStuff(22000)。然后(函数(){
多斯塔夫(31000);
});
});

javascript中的超时是异步的。按照您现在编写的方式,所有三个承诺都是按顺序执行的,超时函数只是将其中的代码排成队列,以便在特定的时间段后运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被视为“完成”。这就是为什么第二个和第三个承诺不必等待“console.log”(“now”+num);”行在启动之前执行


有关js中异步任务的一些背景信息,请参见此答案。

javascript中的超时是异步的。按照您现在编写的方式,所有三个承诺都是按顺序执行的,超时函数只是将其中的代码排成队列,以便在特定的时间段后运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被视为“完成”。这就是为什么第二个和第三个承诺不必等待“console.log”(“now”+num);”行在启动之前执行


有关js中异步任务的一些背景信息,请参见此答案。

javascript中的超时是异步的。按照您现在编写的方式,所有三个承诺都是按顺序执行的,超时函数只是将其中的代码排成队列,以便在特定的时间段后运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被视为“完成”。这就是为什么第二个和第三个承诺不必等待“console.log”(“now”+num);”行在启动之前执行


有关js中异步任务的一些背景信息,请参见此答案。

javascript中的超时是异步的。按照您现在编写的方式,所有三个承诺都是按顺序执行的,超时函数只是将其中的代码排成队列,以便在特定的时间段后运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被视为“完成”。这就是为什么第二个和第三个承诺不必等待“console.log”(“now”+num);”行在启动之前执行


有关js中异步任务的一些背景信息,请参见此答案。

您必须将函数传递给
。然后
,不是承诺。您必须将函数传递给
。然后
,不是承诺。您必须将函数传递给
。然后
,而不是承诺。您必须将函数传递给
。然后
,不是承诺。如果你在做ES6,箭头函数会更短。如果你在做ES6,箭头函数会更短。如果你在做ES6,箭头函数会更短。如果你在做ES6,箭头函数会更短。如果你在做ES6,箭头函数会更短。