Как выполнить код синхронно в nodejs? Есть код:if (price) {
connection.query('UPDATE fotopovtory SET price="' + price + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) throw err;
});
}
if (type) {
connection.query('UPDATE fotopovtory SET tipe="' + type + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) throw err;
});
}
res.end();
Проблемма в том, что после выполнения первого if происходит res.end() и клиентский скрипт (получив калбек) обновляет страницу, при этом видны изменения только первого if, поскольку 2й if еще не успевает доработать. Обновив страницу снова - все стает нормально. Вопрос - как выполнить res.end(); только после того, как оба обращения в базу будут завершены?

21 Авг 2019 в 07:08
192 +1
2
Ответы
1

Для выполнения кода синхронно в Node.js можно использовать Promise или async/await. В данном случае можно создать два промиса для каждого запроса в базу данных и дождаться их выполнения перед вызовом res.end().

Пример с использованием Promise:

const promise1 = new Promise((resolve, reject) => {
if (price) {
connection.query('UPDATE fotopovtory SET price="' + price + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) reject(err);
resolve();
});
} else {
resolve();
}
});
const promise2 = new Promise((resolve, reject) => {
if (type) {
connection.query('UPDATE fotopovtory SET tipe="' + type + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) reject(err);
resolve();
});
} else {
resolve();
}
});
Promise.all([promise1, promise2])
.then(() => {
res.end();
})
.catch((error) => {
throw error;
});

Другой способ с использованием async/await:

const updatePrice = () => {
return new Promise((resolve, reject) => {
if (price) {
connection.query('UPDATE fotopovtory SET price="' + price + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) reject(err);
resolve();
});
} else {
resolve();
}
});
};
const updateType = () => {
return new Promise((resolve, reject) => {
if (type) {
connection.query('UPDATE fotopovtory SET tipe="' + type + '" WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
if (err) reject(err);
resolve();
});
} else {
resolve();
}
});
};
const main = async () => {
try {
await updatePrice();
await updateType();
res.end();
} catch (error) {
throw error;
}
};
main();

Оба эти способа позволят выполнить код синхронно и дождаться завершения обоих обновлений в базе данных перед вызовом res.end().

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 577 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир