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

时间:2015-10-21 13:58:27

标签: ecmascript-6 es6-promise

我正在努力了解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

我期待相反的顺序。我明白为什么会这样,他们都排队等候并按“反向”顺序完成。

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

不是有拼写错误吗?你应该将then部分链接到doStuff调用,也许是这样的:

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

答案 2 :(得分:0)

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

有关js中异步任务的一些背景,请参阅此答案https://stackoverflow.com/a/19626821/2782404