离子检查多个Promises完成

时间:2017-12-09 07:47:14

标签: javascript angular ionic-framework

如果所有承诺都已完成,我想运行多个承诺并打印结果。目前我尝试以下方法:

for (let p of this.invoiceProduct) {
  this.promotionSvc.checkPromoBuyNGetN(this.username, p).then(result => {
    console.log(result);
    this.promoBuyNGetNData.push(result);
  })
}

Promise.all(this.promoBuyNGetNData).then(values => {
  console.log(values);
})

在控制台中,它为[]打印console.log(values),为{id: "e620c8a8-dca8-11e7-8443-2c56dcbcb038", productIdGet: "98926f8c-6afb-11e7-8dd4-2c56dcbcb038", productGet: "Style Laki", getN: 1, description: ""}打印console.log(result)

从上面的结果我们可以看出Promise.all不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

Promise.all期待一系列承诺。您需要更改for循环以将promises放入this.promoBuyNGetNData。如果我理解正确,这段代码应该做你想要的。

for (let p of this.invoiceProduct) {
  const promise = this.promotionSvc.checkPromoBuyNGetN(this.username, p);
  promise.then(result => {
    console.log(result);
  });
  this.promoBuyNGetNData.push(promise);
}

Promise.all(this.promoBuyNGetNData).then(values => {
  console.log(values);
});

您可以通过删除promise.then控制台日志并将for循环转换为地图来使其更清洁。

this.promoBuyNGetNData = this.invoiceProduct.map(p => this.promotionSvc.checkPromoBuyNGetN(this.username, p));
Promise.all(this.promoBuyNGetNData).then(values => {
  console.log(values);
});

答案 1 :(得分:1)

你似乎试图在数组中推送promises的结果,然后调用Promise.all

Promise.all获取一组promise对象并调用所有这些对象,然后在完成所有promise时触发then。你可以这样做:

promoData:any[]=[];//class variable

for (let p of this.invoiceProduct) {
  this.promoBuyNGetNData.push(this.promotionSvc.checkPromoBuyNGetN(this.username, p));//push the promise function into array
}

Promise.all(this.promoBuyNGetNData).then(values => {
  console.log(values);// all results within values array
  this.promoData=values;
})

在你的HTML中,

<tr *ngFor="let p of promoData">