【问题标题】:Sequelize Wait until loop续集等待直到循环
【发布时间】:2020-10-05 13:48:52
【问题描述】:

我正在尝试运行 sequelize 查询并将值存储在数组中,问题是当映射在元素上迭代时,它会立即运行所有元素,而不是等待第一个元素查询完成new 它正在同时运行。

假设数组是 = [0,1,2] 会发生什么,当我迭代它时,所有与数组 [0]、arr[1]、数组 [2] 处的值相关的查询.. . 同时运行。

我想要什么,当我迭代时,所有与 array[0] 处的值相关的查询都会被执行,然后循环应该针对 array[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));

任何帮助将不胜感激

【问题讨论】:

    标签: javascript node.js promise async-await sequelize.js


    【解决方案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")
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 2021-07-23
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多