首页 > 解决方案 > 更好地理解 Promise.prototype.then

问题描述

我有一个看起来像这样的代码

function hello(){
     setTimeout(() => console.log("after 3sec"), 3000);
 }
  let x = Promise.resolve()
  x.then(() => {
  hello()
  }).then(() => console.log("after 1st then"))

现在输出很奇怪,第二个中的console.log then 函数在第一个中的console.log 之前执行然后..如何使其同步,我的意思是我怎么能说第二个.then应该只在第一个之后执行.then

标签: javascriptajaxecmascript-6async-awaites6-promise

解决方案


setTimeout它本身不返回 Promise - 它是基于回调的。如果要在 Promise 链中使用基于回调的函数,则必须将其显式转换为 Promise:

let x = Promise.resolve()
x.then(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("after 500ms");
      resolve();
    }, 500);
  });
}).then(() => console.log("after 1st then"))

至于你的新问题,你必须hello返回一个 Promise,然后返回hello调用,以便它可以被链接:

function hello() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log("after 500ms");
      resolve();
    }, 500);
  });
}
let x = Promise.resolve()
x.then(() => {
  return hello()
}).then(() => console.log("after 1st then"))


推荐阅读