Продолжение ожидания до цикла

#javascript #node.js #promise #async-await #sequelize.js

#javascript #node.js #обещание #асинхронный -ожидание #sequelize.js

Вопрос:

Я пытаюсь выполнить запросы sequelize и сохранить значения в массиве, проблема в том, что когда карта выполняет итерацию по элементу, тогда она запускает все элементы одновременно, не ожидая завершения запросов к первому элементу, тогда новый выполняется одновременно.

что происходит, если предположить, что массив равен = [0,1,2], когда я перебираю его, тогда все запросы относятся к значению в array[0], arr[1], array[2] … выполняется одновременно.

что я хочу, когда я выполняю итерацию, тогда выполняются все запросы, связанные со значением в массиве [0], затем цикл должен выполняться для значений массива [1] и так далее…

   await Promise.all([
            timingBreak.map(async function (element) {
              console.log(
                "**************** STARTING NEW *****************",
                element
              );

              obj.timing_name = element.name;
              obj.start_time = element.start_time;
              obj.end_time = element.end_time;

              //new data points

              var [
                d_total_unique_menu_items_ordered,
              ] = await db.sequelize.query(
                "SELECT count(DISTINCT menui.menu_id) as d_total_unique_menu_items_ordered from ir_reservation_order_menu_items menui join ir_reservation_details_offline booking where booking.restau_id=(:restau_id) and DATE(menui.created_at) between (:from) AND (:to) AND TIME(menui.created_at) >= (:start_time) AND TIME(menui.created_at) <= (:end_time);",
                {
                  replacements: {
                    end_time: element.end_time,
                    start_time: element.start_time,
                    from: from_date,
                    to: to_date,
                    restau_id: restau_id,
                  },
                }
              );

              obj.d_total_unique_menu_items_ordered = await d_total_unique_menu_items_ordered[0]
                .d_total_unique_menu_items_ordered;

              //new data points
              var [
                d_total_number_of_cancelled_menu_items,
              ] = await db.sequelize.query(
                "SELECT count(menui.menu_id) as d_total_number_of_cancelled_menu_items from ir_reservation_order_menu_items menui join ir_reservation_details_offline booking where booking.restau_id=(:restau_id) and menui.is_cancelled=1 AND DATE(menui.created_at) between (:from) AND (:to) AND TIME(menui.created_at) >= (:start_time) AND TIME(menui.created_at) <= (:end_time);",
                {
                  replacements: {
                    end_time: element.end_time,
                    start_time: element.start_time,
                    from: from_date,
                    to: to_date,
                    restau_id: restau_id,
                  },
                }
              );

              obj.d_total_number_of_cancelled_menu_items = await d_total_number_of_cancelled_menu_items[0]
                .d_total_number_of_cancelled_menu_items;

              //new data points
              var [
                d_average_number_of_menu_items_per_order,
              ] = await db.sequelize.query(
                "SELECT (count(distinct menui.ordered_menu_detail_id)/count(distinct menui.ir_order_id)) as d_average_number_of_menu_items_per_order from ir_reservation_order_menu_items menui join ir_reservation_details_offline booking where booking.restau_id=(:restau_id) and menui.is_cancelled=0 AND DATE(menui.created_at) between (:from) AND (:to) AND TIME(menui.created_at) >= (:start_time) AND TIME(menui.created_at) <= (:end_time);",
                {
                  replacements: {
                    end_time: element.end_time,
                    start_time: element.start_time,
                    from: from_date,
                    to: to_date,
                    restau_id: restau_id,
                  },
                }
              );

              obj.d_average_number_of_menu_items_per_order = await d_average_number_of_menu_items_per_order[0]
                .d_average_number_of_menu_items_per_order;

              //new data point
              var [
                d_best_10_selling_menu_items_based_on_pricing,
              ] = await db.sequelize.query(
                "SELECT distinct menui.menu_id,count(menui.menu_id),menui.menu_name,menui.price,sum(menui.price),menui.price_unit_id,sum(menui.quantity) FROM ir_reservation_order_menu_items menui join ir_reservation_details_offline booking where booking.restau_id=(:restau_id) AND menui.is_cancelled=0 AND DATE(menui.created_at) between (:from) AND (:to) AND TIME(menui.created_at) >= (:start_time) AND TIME(menui.created_at) <= (:end_time) group by menui.menu_id order by sum(menui.price) DESC LIMIT 20;",
                {
                  replacements: {
                    end_time: element.end_time,
                    start_time: element.start_time,
                    from: from_date,
                    to: to_date,
                    restau_id: restau_id,
                  },
                }
              );

              obj.d_best_10_selling_menu_items_based_on_pricing = await d_best_10_selling_menu_items_based_on_pricing;

              //new data point
              var [
                d_most_10_selling_menu_items_based_on_quantity,
              ] = await db.sequelize.query(
                "SELECT distinct menui.menu_id,count(menui.menu_id),menui.menu_name,menui.price,sum(menui.price),menui.price_unit_id,sum(menui.quantity) FROM ir_reservation_order_menu_items menui join ir_reservation_details_offline booking where booking.restau_id=(:restau_id) AND menui.is_cancelled=0 AND DATE(menui.created_at) between (:from) AND (:to) AND TIME(menui.created_at) >= (:start_time) AND TIME(menui.created_at) <= (:end_time) group by menui.menu_id order by sum(menui.quantity) DESC LIMIT 20",
                {
                  replacements: {
                    end_time: element.end_time,
                    start_time: element.start_time,
                    from: from_date,
                    to: to_date,
                    restau_id: restau_id,
                  },
                }
              );

              obj.d_most_10_selling_menu_items_based_on_quantity = await d_most_10_selling_menu_items_based_on_quantity;

              timing_based_report.push(obj);
              obj = {};
            }),
          ]).catch((error) => console.log("dynamic data error", error));
  

любая помощь будет оценена

Ответ №1:

попробуйте это,

  async function saveData(){
    try {
     for (const id of [1,2,3]) {
         await saveToDb(id);
     }
    } catch (error) {
        console.log(error)
    }
 }

 async function saveToDb(id){
    try {
        // use await and apply your logic here
    } catch (error) {
        throw Error("Failed")
    }
 }