#node.js #promise #sequelize.js #nestjs #sequelize-typescript
#node.js #обещание #sequelize.js #nestjs #продолжение-typescript
Вопрос:
У меня есть функция, которая получает заказ из базы данных, создает объект из ответа, получает ответ из базы данных для всех позиций и перебирает эти элементы, чтобы получить подробные записи. Проблема, с которой я сталкиваюсь, заключается в том, что общая функция возвращается, даже несмотря на то, что я пытаюсь дождаться ответа от подзапросов.
Код следующим образом:
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, но затем он нажмет addItem, прежде чем ждать, пока результат orderLineDetails будет создан и добавлен в массив orderLineDetails . Если я позволю всему этому выполняться, точка останова с нажатием для orderLineDetails будет выполняться через секунду после того, как ответ уже был возвращен.
Чего мне не хватает?
Ответ №1:
Итак, проблема заключалась в методе, который я использовал для выполнения сопоставлений (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;