简体   繁体   English

带有 setTimeout 的 JavaScript Promise 按顺序解析

[英]JavaScript Promises with setTimeout resolve in sequence

I want to print 3 messages in a timed sequence, where each message is displayed after n seconds after the previous message is displayed.我想按时间顺序打印 3 条消息,其中每条消息在上一条消息显示后n秒后显示。 Requiring to implement this with JavaScript and using Promises, I wrote a function called printLater that returns a Promise that leverages setTimeout to implement the blocking/waiting mechanism as follows:需要使用 JavaScript 并使用 Promise 来实现这一点,我编写了一个名为printLater的函数,该函数返回一个利用setTimeout实现阻塞/等待机制的 Promise,如下所示:

let printLater = (message, delay) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(message);
            resolve();
        }, delay);        
    })
}

Then, I tried using 3 promises to print the messages in sequence and using delays.然后,我尝试使用 3 个 promise 按顺序打印消息并使用延迟。

printLater('first message, after 2 seconds from start of program', 2_000)
    .then(printLater('second message, after 5 seconds after first message is displayed', 5_000))
    .then(printLater('third message, after 1 second after second message is displayed', 1_000));

The required output is:所需的输出是:

first message, after 2 seconds from start of program
second message, after 5 seconds after first message is displayed
third message, after 1 second after second message is displayed

But the actual output was:但实际输出是:

third message, after 1 second after second message is displayed
first message, after 2 seconds from start of program
second message, after 5 seconds after first message is displayed

I am trying to understand why the sequence is out of order, given that I am resolving within the function specified for the setTimeout .鉴于我正在为setTimeout指定的函数内解析,我试图理解为什么序列是乱序的。

You can create another function to return a wrapper for printLater() :您可以创建另一个函数来返回printLater()的包装器:

const printLaterCallback = (message, delay) =>
    () => printLater(message, delay);

Then you can use that in the .then() calls:然后你可以在.then()调用中使用它:

printLater('first message, after 2 seconds from start of program', 2_000)
    .then(printLaterCallback('second message, after 5 seconds after first message is displayed', 5_000))
    .then(printLaterCallback('third message, after 1 second after second message is displayed', 1_000));

Hi the Promise chaining is in-correct嗨,Promise 链接不正确

const printLater = (message, delay) => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log(`*** ${message} ***`);
    resolve();
  }, delay);
});

printLater('first message, after 2 seconds from start of program', 2000)
  .then((data) => {
    printLater('second message, after 5 seconds after first message is displayed', 5000)
      .then((data) => {
        printLater('third message, after 1 second after second message is displayed', 1000).then((data) => {});
      });
  });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM