在foreach内兑现承诺的最佳方法是什么?
我有一个数组,需要将每个项目发送到RestFull API。 但是同时,我必须检查响应是否正确(我有一个计数器'errorSendPayment')。 在所有请求之后,我想知道是否发送一个布尔值或Promise错误(或者多个)。
如何改善代码?
public sendPaymentValues(sale: any, session: string): Promise<boolean> {
const headers = this.getHeader();
// counter
let errorSendPayment = 0;
sale.data.list.forEach(payment=> {
this.http.post(`${api}payment/`, payment, headers)
.toPromise()
.then((result: any) => {
if (!result.sucess) {
errorSendPayment++;
}
})
.catch((response: HttpErrorResponse) => {
this.httpErrorResponseHandler(response);
});
});
const promise: Promise<boolean> = new Promise((resolve, reject) => {
if (errorSendPayment <= 0) {
resolve();
} else {
reject();
}
});
return promise;
}
答案 0 :(得分:1)
使用Observable的zip
运算符来组合http调用。
并检查结果是否有错误。
然后通过致电toPromise
做出承诺。
更新如果您使用的版本高于RxJS 5.5,请导入一个运算符。
import { zip } from 'rxjs';
public sendPaymentValues(sale: any, session: string): Promise<boolean> {
const headers = this.getHeader();
const obs$ = sale.data.list.map(payment => this.http.post(`${api}payment/`, payment, headers))
return zip(...obs$).map(arr => arr.some(res => !res.success)).toPromise()
}