Как выполнить код синхронно в 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(); только после того, как оба обращения в базу будут завершены?
Для выполнения кода синхронно в 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().
Для выполнения кода синхронно в 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().