范围问题在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
它给出了一个很好的概念性的概述,如果你把函数放在循环中会发生什么