Node.js在循环范围问题中调用回调函数

时间:2014-07-09 18:54:34

标签: node.js for-loop callback scope

我正在构建以下代码:

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') {
                 datos[i].LasValueBTC=data.result.Last;
            } else {
                 datos[i].LasValueBTC='';   
            }  
        }
    });
}

好吧我收到一条错误消息:“无法设置未定义的属性'LasValueBTC'”。所以我猜测在变量函数中我没有理解变量。 我尝试没有成功:

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') {
                 datos[i].LasValueBTC=data.result.Last;
            } else {
                 datos[i].LasValueBTC='';   
            }  
        }
    })(i)); //and also i tried }).bind(this,i)); 
}

这是如何解决的?

此致

1 个答案:

答案 0 :(得分:0)

问题很可能getticker是异步的,而for循环是同步的,所以i的值可能不是你预期的那个时候访问datos[i]。一个简单的解决方案如下:

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]));
}
相关问题