2016-03-19 74 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

換句話說 - 這不是一個可達性問題,而是時間問題。