Javascript 我如何才能等待两个承诺完成,再运行另一个?

Javascript 我如何才能等待两个承诺完成,再运行另一个?,javascript,es6-promise,Javascript,Es6 Promise,我正试图实现两个承诺: Promise.all([…]) 但是他们都有自己的。然后: Promise.all([promise1().then(…),promise2().then(…])) 我希望在Promise.all上运行另一个。然后,同时等待这两个。如果有意义的话,然后返回 下面是一个演示我的意思的示例。如果您想在javascript中使用异步操作,有3种方法可以使用 回拨 允诺 异步/等待 为了实现您想要的东西,最佳和优化的方法是使用async/await方法 您可以这样做:

我正试图实现两个承诺:

Promise.all([…])
但是他们都有自己的
。然后

Promise.all([promise1().then(…),promise2().then(…]))
我希望在Promise.all上运行另一个
。然后
,同时等待这两个
。如果有意义的话,然后
返回


下面是一个演示我的意思的示例。

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

  • 回拨
  • 允诺
  • 异步/等待
  • 为了实现您想要的东西,最佳和优化的方法是使用async/await方法

    您可以这样做:

          async function getAllData(){
    
          const p1 = await promise1;
          const p2 = await promise2;
           
          }
    
    现在,您可以使用.then()获取结果,使用.catch()获取错误

    要了解有关语法和其他功能的更多信息,您可以访问此网站:

    如果您运行

    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")
      })
    })()
    
    那么结果是正确的

    一,

    二,

    三,

    然后你再次得到正确的答案

    一,

    二,

    三,

    因此,问题出在
    ps.map(拒绝)
    的部分。让我们看看:

    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")
      })
    })()
    
    输出


    两个元素的数组都是
    未定义的
    ,计算起来很简单。因为
    ps.map(拒绝)
    是一个箭头函数,它命名其参数拒绝,并且不返回任何内容。

    最佳和优化的方法是使用async/await方法
    不,不是。OP希望并行地执行承诺。wait以串行方式进行。将多个承诺组合成一个承诺,让我们假设您有p1,p2,p3,…,pn。如果等待p1,然后等待p2,然后等待pn,那么复杂度为O(p1+p2+…+pn)。但是,如果以并行方式运行它们,则复杂性为O(max(p1,p2,…,pn))。后者好得多。例如,2+8+16+15=41>16=max(2,8,16,15)。可能存在巨大的差异。我相信@AZ_想在他的评论中指出这一点。
    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")
      })
    })()