我有一个函数从数据库获取订单,从响应中创建一个对象,从数据库获取所有行项的响应,并循环这些项以获取详细记录。我遇到的问题是即使我试图等待子查询的响应,整个函数也会返回。
代码如下:
public async getOrderById(orderId:string) {
const order: [any] = await this.dbInstance.query('exec getOrder :orderID' {replacements: {orderID: orderId}, type: sequelize.QueryTypes.SELECT});
const orderLines: [any] = await this.dbInstance.query('exec getOrderLines :orderID' {replacements: {orderID: orderId}, type: sequelize.QueryTypes.SELECT});
const orderArray: any = order.map((o) => {
return {
orderId,
customerId: o.CustomerID
total: o.total,
lines: []
};
});
const orderResponse: Order = orderArray[0];
orderLines.forEach(async (orderLine) => {
let addItem: any;
addItem = {
itemNumber: orderLine.itemNumber,
quantity: orderLine.quantity,
unitPrice: orderLine.unitPrice,
orderLineDetails: []
};
await this.dbInstance.query('exec getLineDetails :orderLineId{replacements: {orderLineId: orderLine.orderLineId}, type: sequelize.QueryTypes.SELECT})
.then( (details) => {
details.forEach((detail) => {
addItem.orderLineDetails.push({
name: detail.name,
value: detail.val
});
});
});
orderResponse.orderLines.push(addItem);
});
return orderResponse;
}
因此代码将进入订单行上的forEach,创建add Item,但是在等待orderLineDetails的结果创建并添加到orderLineDetails数组之前,它将推送addItem。如果我让整个事情运行,那么推送orderLineDetails的断点将在响应已经返回后运行一秒。
我错过了什么?
所以问题是我用来执行非异步映射(forEach)的方法,以及修改循环中的底层集合。
我最终做了这个改变:
const orderLinePromises = orderLines.map(async (orderLine) => {
let addItem : any;
addItem = {
itemNumber: orderLine.itemNumber,
quantity: orderLine.quantity,
unitPrice: orderLine.unitPrice,
orderLineDetails: []
};
const details = await this.dbInstance.query('exec getLineDetails :orderLineId{replacements: {orderLineId: orderLine.orderLineId}, type: sequelize.QueryTypes.SELECT});
addItem.orderLineDetails = details.map((detail) => {
return {
name: detail.name,
value: detail.val,
};
);
return addItem;
});
orderResponse.orderLines = await Promise.all(orderLinePromises);
return orderResponse;