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);