为了账号安全,请及时绑定邮箱和手机立即绑定

我如何等待 2 个承诺完成,再运行另一个?

我如何等待 2 个承诺完成,再运行另一个?

回首忆惘然 2023-04-01 15:33:28
我正在尝试通过以下方式实现两个承诺:Promise.all([...])但他们都有自己的.then:Promise.all([promise1().then(...), promise2().then(...)]).then我希望在 Promise.all 上运行另一个,同时也在等待两者.then返回(如果有任何意义的话)。这是一个显示我的意思的小提琴。
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

如果你跑


function get1() {

  return new Promise((r)=>setTimeout(() => r(),3000))

}


function rejection() {/*Handle rejection*/}


function doAll(...ps) {

    return Promise.all(ps.map(rejection))

}


(async () => {

  var p1 = get1().then(()=>console.log("1"));

  var p2 = get1().then(()=>console.log("2"));

    Promise.all([p1, p2]).then(()=>{

    console.log("3")

  })

})()

那么结果是正确的


1


2


3


If you run


function get1() {

  return new Promise((r)=>setTimeout(() => r(),3000))

}


function rejection() {/*Handle rejection*/}


function doAll(...ps) {

    return Promise.all(ps)

}


(async () => {

  var p1 = get1().then(()=>console.log("1"));

  var p2 = get1().then(()=>console.log("2"));

    doAll(p1, p2).then(()=>{

    console.log("3")

  })

})()

然后你又得到正确的


1


2


3


结果,问题出在ps.map(rejection). 让我们来看看:


function get1() {

  return new Promise((r)=>setTimeout(() => r(),3000))

}


function rejection() {/*Handle rejection*/}


function doAll(...ps) {

    console.log(ps);

  console.log(ps.map(rejection));

    return Promise.all(ps.map(rejection));

}


(async () => {

  var p1 = get1().then(()=>console.log("1"));

  var p2 = get1().then(()=>console.log("2"));

    doAll(p1, p2).then(()=>{

    console.log("3")

  })

})()

输出

//img1.sycdn.imooc.com//6427de70000175ba02140094.jpg

两个元素的数组,两者都是undefined微不足道的评估。因为ps.map(rejection)是一个箭头函数,它命名它的参数为 rejection 并且不返回任何东西。



查看完整回答
反对 回复 2023-04-01
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

如果你想在 javascript 中使用异步操作,你可以使用 3 种方法。

  1. 打回来

  2. 承诺

  3. 异步/等待

为了实现您想要的确切内容,最好和优化的方法是使用 async/await 方法。

你可以这样做:

async function getAllData(){


      const p1 = await promise1;

      const p2 = await promise2;

       

      }

现在 getAllData 返回 Promise,您可以使用 .then() 获取结果并使用 .catch() 获取错误。


查看完整回答
反对 回复 2023-04-01
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信