node.js / postgres …asynchronous问题?

我有一个types的列表:[“type1”,“type2,”type3“],我循环。对于每种types:
– 创build/执行查询来获取当前types的项目
– 当查询完成时(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(){ ... } } 

我想这是链接到asynchronous过程…但不能找出错误的地方。

UPDATE

我已经更新了我的循环,所以它看起来像:

  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(){ ... } } 

 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允许您将参数绑定到一个函数。

永远不要使用。 另一个可行的方法是:

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