#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")
}
}