Продолжить запрос в гнезде.JS не разрешается перед возвратом

#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;