node.js / postgres… асинхронная проблема?

#postgresql #node.js

#postgresql #node.js

Вопрос:

У меня есть список типов: [«type1», «type2», «type3»], на которых я выполняю цикл. Для каждого типа:
— создайте / выполните запрос, чтобы получить элементы текущего типа
— запустите другую функцию, когда запрос будет выполнен (on(‘end’) ).

  for ( var i=0; i<types.length; i   ){
    type = types[i];
    value = "test";
    ...

    // ADD ITEM: QUERY
    var query = client.query(...); // QUERY ITEMS OF A THE CURRENT TYPE

    // ADD ITEM: ERROR CHECKING
    query.on("error", function (err) {
      ...
    });

    with ({ t: type, v: value }) {  // I HAD TO DO THAT SO THAT ALL THE TYPES ARE TAKEN INTO ACCOUNT
      query.on('end', function() {
        my_function(t, v);
      });
    }
  }
  

my_function похожа:

 function my_function(type, value){
   console.log(type   ','   value);  // CORRECT (I CAN SEE ALL THE TYPES BEEING LISTED)

   // QUERY OTHER STUFF BASED ON THE VALUE OF "type"
   var query = client.query(...);

   // MAIN STUFF
   query.on('row', function(row){
      console.log(type   ','   value);  // THIS DOES NOT WORK ANYMORE... ONLY THE LAST TYPE IS TAKEN INTO ACCOUNT WHERE I EXPECT TO GET THIS MESSAGE FOR EACH TYPES.
     ...
   }

   // FINALIZE
   query.on('end', function(){
      ...
   }      
}
  

Я предполагаю, что это связано с асинхронным процессом… но не могу определить, в чем ошибка.

Обновить

Я обновил свой цикл, чтобы он выглядел так:

  for ( var i=0; i<types.length; i   ){
    type = types[i];
    value = "test";
    ...

    // ADD ITEM: QUERY
    var query = client.query(...); // QUERY ITEMS OF A THE CURRENT TYPE

    // ADD ITEM: ERROR CHECKING
    query.on("error", function (err) {
      ...
    });

    // MAIN STUFF GOES HERE
    (function(t, v) { query.on("end", function() {
      console.log(t   ','   v); // OK, I CAN SEE THIS DISPLAYED FOR EACH TYPE
      my_function(t, v);
    }); })(type, value);
  }
  

Я изменил my_function, чтобы это выглядело как:

 function my_function(type, value){
   console.log(type   ','   value);  // OK, I CAN SEE THIS DISPLAYED FOR EACH TYPE

   // QUERY OTHER STUFF BASED ON THE VALUE OF "type"
   var query = client.query(...);

   // MAIN STUFF
   (function(t, v) {
     query.on("row", function(row) {
       console.log('TEST:'   t   ','   v); // KO, I CAN ONLY SEE THIS DISPLAYED FOR ONE TYPE
   }); })(type, value);

   // FINALIZE
   query.on('end', function(){
      ...
   }      
}
  

Ответ №1:

 with ({ t: type, v: value }) {  // I HAD TO DO THAT SO THAT ALL THE TYPES ARE TAKEN INTO ACCOUNT
      query.on('end', function() {
        my_function(t, v);
      });
    }
  

Неисправен. Чего вы хотите, так это

 query.on("end", my_function.bind(null, type, value));
  

Function.prototype.bind позволяет привязывать параметры к функции.

Никогда не используйте with . Альтернативой, которая также работает, было бы :

 (function(t, v) {
  query.on("end", function() { my_function(t, v); });
})(type, value);
  

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

1. @raynos, большое спасибо. Я использовал альтернативный формат, он отлично работает. Это непростая задача. Приветствия.

2. @Luc единственный способ, которым я могу представить себе эту ошибку, — это если у вас было, скажем, 3 типа и было 3 события строк для последнего типа и ноль событий строк для первых двух.

3. @raynos, у меня есть внутренняя функция, которую я еще не модифицировал с помощью альтернативного формата. Я сделаю это и дам вам знать. Я думаю, тогда все будет в порядке 🙂

4. @raynos, поскольку я неправильно настроил внутренние функции, я думаю, что база данных повреждена. Я начну снова с пустой базы данных. Я думаю, вы правы. Спасибо за ваш ответ. Приветствую, Люк

5. @raynos. Теперь все в порядке. Спасибо за вашу помощь.