Veneomin
@Veneomin

Как выполнить код синхронно в 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(); только после того, как оба обращения в базу будут завершены?
  • Вопрос задан
  • 2783 просмотра
Решения вопроса 1
dizballanze
@dizballanze
Software developer at Yandex
Вам не нужно здесь выполнять код синхронно. Нужно просто дожидаться вызова 2х коллбек функций и затем выполнять res.end(). Проще всего это сделать при помощи модуля async:

var async = require("async");

// ...


var tasks = [];

if (price) {
    tasks.push(function(callback) {
        connection.query('UPDATE fotopovtory SET price="' + price + '" WHERE foto_id = "' + itemId + '";', callback);
    });
}

if (type) {
    tasks.push(function(callback) {
        connection.query('UPDATE fotopovtory SET tipe="' + type + '" WHERE foto_id = "' + itemId + '";', callback);
    });
}

async.parallel(tasks, function(err) {
    if (err) throw err;
    res.end();
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Конкретно в этом примере можно было бы выполнять 0 или 1 запрос в зависимости от наличие данных.

И res.end(); у вас сейчас тоже, как мне кажется, не верно расположен. Если запрос будет выполняться дольше то он не успеет выполниться раньше чем выполниться res.end(); его по хорошему в этом случае надо вызывать из callbaсk функции.

Если я всё правильно понимаю в NodeJS

Как-то так:
if(price || type) {
	//составляем sql запрос, с 1 или 2 полями
    connection.query('UPDATE fotopovtory SET ....... WHERE foto_id = "' + itemId + '";', function(err, rows, fields) {
		  if(err){
			res.writeHead(500);
			res.end();
		  } else {
			res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
			res.end(results);
		  };
    });
} else {
  res.writeHead(404);
  res.end();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы