node.js / postgres ... асинхронная проблема? - PullRequest
1 голос
/ 09 июня 2011

У меня есть список типов: ["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 Ответ

3 голосов
/ 09 июня 2011
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...