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

时间:2020-09-27 12:16:41

标签: javascript es6-promise

我正在尝试通过以下方式实现两个承诺:

Promise.all([...])

但是他们都有自己的.then

Promise.all([promise1().then(...), promise2().then(...)])

我希望在Promise.all上再运行一个.then,同时还要等待.then都返回。

这是fiddle,说明我的意思。

2 个答案:

答案 0 :(得分:1)

如果您运行

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

输出

enter image description here

两个元素均为undefined的数组很容易评估。因为ps.map(rejection)是一个箭头函数,其名称为参数拒绝,但不返回任何内容。

答案 1 :(得分:0)

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

  1. 回调
  2. 承诺
  3. 异步/等待

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

您可以这样做:

      async function getAllData(){

      const p1 = await promise1;
      const p2 = await promise2;
       
      }

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

要了解有关语法和其他功能的更多信息,请访问以下网站:explain about async and await