如果所有承诺都已完成,我想运行多个承诺并打印结果。目前我尝试以下方法:
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
不起作用。我该如何解决这个问题?
答案 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">