【问题标题】:How to set a timeout inside a promise chain's .then() [duplicate]如何在承诺链的 .then() 中设置超时 [重复]
【发布时间】:2017-09-29 19:54:02
【问题描述】:

我有一个按顺序执行的承诺链。但是我想延迟其中一个,并且在延迟的一个完成之前不让其他的执行。我该如何做到这一点?我尝试了 setTimeOut 但似乎承诺链是异步的,因此超时没有按预期工作。

var p = Promise.resolve("Hello");

p.then((result) => {
  console.log(result);
  console.log("========== Then Block 1");
  return "how are you";
}).then((result)=>{
  console.log(result);
  console.log("========== Then Block 2");
  return "I'm Fine! Thank you"
}).then((result) => {

  setTimeout(function(){
    console.log("Time out Done!");
  }, 3000);

  console.log(result);
  console.log("========== Then Block 3");
}).then(()=>{
  console.log("========== Then Block 4");
})

这打印:

"Hello"
"========== Then Block 1"
"how are you"
"========== Then Block 2"
"I'm Fine! Thank you"
"========== Then Block 3"
"========== Then Block 4"
"Time out Done!"

我想要的是:

"Hello"
"========== Then Block 1"
"how are you"
"========== Then Block 2"
"I'm Fine! Thank you"
"Time out Done!"
"========== Then Block 3"
"========== Then Block 4"

【问题讨论】:

  • setTimeout 本身是异步的。

标签: javascript promise settimeout


【解决方案1】:

创建一个新的 Promise,并在 setTimeout 回调中解决它:

Promise
  .resolve("Hello")
  .then((result) => {
    console.log(result);
    console.log("========== Then Block 1");
    return "how are you";
  })
  .then(result => {
    console.log(result);
    console.log("========== Then Block 2");
    return "I'm Fine! Thank you";
  })
  .then(result => new Promise(resolve => { // <== create a promise here
    setTimeout(function() {
      console.log("Time out Done!");
      console.log(result);
      console.log("========== Then Block 3");
      resolve(); // <== resolve it in callback
    }, 3000);
  }))
  .then(() => {
    console.log("========== Then Block 4");
  });

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2016-01-21
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2018-09-04
    相关资源
    最近更新 更多