范围问题在node.js的循环中调用一个callback函数

在这个线程glproo的帮助下,我构build了这个代码:

for(var i=0;i<datos.length;i++){ bittrex.getticker(datos[i].Currency, function(err, data){ if (err){ console.log('ERROR:', err); return 'ERROR:'+ err; } else { if (data.message!='INVALID_MARKET') { this.LasValueBTC=data.result.Last; } else { this.LasValueBTC=''; } } }.bind(datos[i])); } 

问题是,外部callback函数datos数组没有更新…因为它是写在这一刻,如果我console.log(这个)里面的function伟大的工作和this.LastValueBTC存在于我的JSON,但function之外如果我console.log(datos)循环后,LastValueBTC不存在..我需要做一个res.send(datos)后循环..

你需要做的是等待所有的callback完成,然后调用res.send。

 var count = datos.length; for(var i=0;i<datos.length;i++){ bittrex.getticker(datos[i].Currency, function(err, data){ if (err){ console.log('ERROR:', err); return 'ERROR:'+ err; } else { if (data.message!='INVALID_MARKET') { this.LasValueBTC=data.result.Last; } else { this.LasValueBTC=''; } count--; if (count === 0) { res.send(datos); } } }.bind(datos[i])); } 

或者使用asynchronous

 async.each(datos, function(dato, next) { bittrex.getticker(dato.Currency, function(err, data) { if (err){ console.log('ERROR:', err); next(err); } else { if (data.message!='INVALID_MARKET') { dato.LasValueBTC = data.result.Last; } else { dato.LasValueBTC=''; } next(); } }); }, function(err) { res.send(datos); }); 

阅读这篇文章http://www.richardrodger.com/2011/04/21/node-js-how-to-write-a-for-loop-with-callbacks/#.VTXnFa2eDGc

它给出了一个很好的概念性的概述,如果你把函数放在循环中会发生什么