запросы nodejs, pgSQL и Async

#node.js #postgresql

#node.js #postgresql

Вопрос:

Я новичок в nodejs и пытаюсь получить некоторые данные со своего сервера PG. Мне удается получить свои данные, но не в том порядке, в котором я ожидал. Возможно, я не использую это должным образом, кто-нибудь может помочь?

Вот пример кода :

 var pg = require('pg');

var db = new pg.Client(conString);
var link = db.connect();

var data = {};

// -----
console.log(prefix 'Fetching categories');
db.query('SELECT DISTINCT category FROM cc WHERE category IS NOT NULL', function(err, data){
    data.rows.forEach(function(row){
        data[row.category] = {}; // initialise
    });
console.log('1111111',data,'---------');
});
console.log('2222222',data,'---------');

for (var category in data)
{
    console.log(prefix 'Listing values for on "' category '"');
    var values = db.query('SELECT SUBSTRING(date::varchar, 1,7) AS month, sum(amount) FROM cc WHERE category = '' category '' GROUP BY 1 ORDER BY 1', function(err, data){
        console.log('Got values',data.rows);
    });
}

// -----
console.log(prefix 'Ending connection to database');
//  db.end();

// -----
console.log(prefix 'Ending transaction on server side');
response.end();
  

Я получаю 222222 before 1111111 :/ поэтому мой результат отправляется как пустой, а затем он заполняется: (Что я должен делать?

Спасибо за ваше время!

Комментарии:

1. Конечно, вы получили 222222 до 1111111. Вот как работает асинхронность в node. Ваш первый запрос запускается, после чего node не ожидает завершения запроса, а просто продолжает печатать 222222. Это неблокирующее, что является очень важной особенностью node. Если вы хотите выполнить 2-й запрос после выполнения 1-го запроса, вам нужно поместить его в обратный вызов 1-го запроса, который где console.log(‘1111111′,data,’———‘); есть.

Ответ №1:

Взгляните на обещания :https://github.com/promises-aplus/promises-spec. (одна хорошая библиотека для nodejs — q — http://documentup.com/kriskowal/q /). они действительно полезны для поддержания связности кода nodejs и чистоты во всех этих обратных вызовах. обязательное условие для каждого разработчика nodejs.