更好地了解Promise.prototype.then

时间:2018-05-25 08:26:16

标签: javascript ajax ecmascript-6 async-await es6-promise

我的代码看起来像这样



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




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

之后执行

1 个答案:

答案 0 :(得分:3)

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返回一个承诺,然后返回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"))