代码之家  ›  专栏  ›  技术社区  ›  Shiva Sai

更好地理解promise.prototype.then.

  •  2
  • Shiva Sai  · 技术社区  · 6 年前

    我有个密码,像这样的

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

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   CertainPerformance    6 年前

    setTimeout 它本身不会返回承诺——它是基于回调的。如果要在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 归还承诺,然后归还 你好 调用以便可以链接:

    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"))