【问题标题】:Sequential promises in ES6 JavaScript aren't workingES6 JavaScript 中的顺序承诺不起作用
【发布时间】:2017-10-09 21:56:17
【问题描述】:

我正在尝试理解 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

我期待相反的顺序。我确实理解为什么会这样,它们都排队并以“相反”的顺序完成。

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

【问题讨论】:

  • 你必须传递一个函数给.then,而不是一个promise。

标签: ecmascript-6 es6-promise


【解决方案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));

【讨论】:

  • 如果你在做 ES6,箭头函数会更短。
【解决方案2】:

没有错别字吗?您应该将 then 部分链接到 doStuff 调用,可能像这样:

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

【讨论】:

    【解决方案3】:

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

    查看这个答案https://stackoverflow.com/a/19626821/2782404 了解 js 中异步任务的一些背景知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2018-03-06
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2016-11-11
      相关资源
      最近更新 更多