2016-03-19 71 views
1

我想访问全局声明并在回调函数内部分配的变量。我想访问外面的值。有没有办法做到这一点 ?无法访问内部回调函数分配的变量

我的尝试:

节点JS(ONVIF模块)。

var jsonObject ='['; 
var count = 0; 
var len = cams.length; 

cams.forEach(function(cam) { 
    var hardwareId,serialNumber; 
    cam.getDeviceInformation(function(a,b,c){ 
     hardwareId = b.hardwareId; 
     serialNumber = b.serialNumber;  
     console.log(hardwareId,serialNumber);//working here 
    }); 
    console.log(hardwareId,serialNumber);//getting undefined here 
    count++; 
    jsonObject +='{'; 
    jsonObject +='"hostname":"'+cam.hostname+'",'; 
    jsonObject +='"port":"'+cam.port+'",'; 
    jsonObject +='"hardwareId":"'+hardwareId+'",'; 
    jsonObject +='"serialNumber":"'+serialNumber+'"'; 

    if(count==len) { 
     jsonObject +="}"; 
    } else { 
     jsonObject +="},"; 
    }    
}); 
jsonObject +=']'; 
res.json(JSON.parse(jsonObject)); 

我知道这是由于异步调用。有人可以看看代码,并告诉更好的写法。

+1

变量可以在函数之外访问,但在调用函数之前,它们的值将是'未定义的'。 – Tushar

+0

它看起来像你的回调永远不会执行,或者'b._'未定义。尝试在回调主体中添加'console.log(“Calling callback”,a,b,c)'并查看它是否出来。 'cam.getDeviceInformation'也可能异步工作 - 它可能会立即返回,然后记录未定义的内容,然后调用回调函数。 –

+1

'.getDeviceInformation'似乎异步返回结果,在'.getDeviceInformation'回调完成之前调用console.log()'?您可以将'serialNumber'作为参数传递给另一个函数调用,或者在'getDeviceInformation'回调中执行'console.log()'或其他任务? – guest271314

回答

0

这是可能的,但如果传递给getDeviceInformation的函数没有同步调用,那么在调用console.log时变量仍然为undefined

换句话说 - 这不是一个可达性问题,而是时间问题。