【问题标题】:How do I use .then() after a new Promise is resolved, before returning the whole function as resolved在解决新的 Promise 后如何使用 .then() ,然后将整个函数返回为已解决
【发布时间】:2021-08-30 21:52:41
【问题描述】:
promo()
    .then((e) => console.log("finished everything"))
    .catch((e) => console.log("failed everything"))
    .finally((e) => console.log("done", e));

function promo() {
    console.log("awaiting promise");
    return new Promise((resolve, reject) => {
        setTimeout((e) => {
            console.log("done with first promise");
            resolve("done");
        }, 2000);
    }).then((e) => {
        console.log("starting second promise");

        new Promise((resolve) => {
            setTimeout((e) => {
                console.log("done with second promise");
                resolve("done2");
            }, 2000);
        });
    });
}

我怎样才能使 promo() 在第二个 .then() 完成之前不会完成?现在它会在第一个 Promise 结束后立即返回它,并且在 finally() 之后触发 .then();

这是输出:

awaiting promise
done with first promise
starting second promise
finished everything 
done 
done with second promise

但我期望的是:

awaiting promise
done with first promise
starting second promise
done with second promise
finished everything 
done 

【问题讨论】:

  • 为什么会这样?
  • 因为它返回一个带有 .then() 的承诺,这也是我想要它做的,我也几乎不明白承诺是如何工作的
  • 你需要return then() 回调中的promise,当它检测到一个promise被返回时,它会等待那个promise完成后再继续

标签: javascript asynchronous promise


【解决方案1】:

你错过了回报:

}).then((e) => {
  console.log("starting second promise");
//VVVVVV
  return new Promise((resolve) => {
    setTimeout((e) => {
      console.log("done with second promise");
      resolve("done2");
    }, 2000);
  });
});

任何时候你打电话给.then 一个承诺,你创建一个新的承诺。如果你在.then 回调中返回一个promise,那么你的新promise 将与返回的promise 解析的任何内容一起解析。相反,如果您返回一个非承诺值,那么新的承诺将解析为该值,而不会产生额外的延迟。由于您隐式返回 undefined,因此一旦第一个 Promise 完成,您的新 Promise 就会解析为 undefined。

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2017-10-24
    • 1970-01-01
    • 2023-03-17
    • 2022-10-05
    • 2016-12-28
    • 2017-10-08
    • 1970-01-01
    • 2015-03-17
    相关资源
    最近更新 更多