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

変数は関数の外部からアクセスできますが、関数を呼び出す前に、その値は 'undefined'になります。 – Tushar

+0

あなたのコールバックは実行されないか、 'b._'は未定義です。コールバック本体に 'console.log(" Calling callback "、a、b、c)'を追加して、それが出てくるかどうか確認してください。また、 'cam.getDeviceInformation'が非同期で動作する可能性もあります。即座に戻り、未定義を記録した後、コールバックが呼び出されます。 –

+1

'.getDeviceInformation'コールバックが完了する前に' console.log() 'が呼び出されたところで、' .getDeviceInformation'は結果を非同期的に返すように見えますか?別の関数呼び出しにパラメータとして 'serialNumber'を渡すか、' console.log() 'や' getDeviceInformation'コールバック内の他のタスクを実行できますか? – guest271314

答えて

0

getDeviceInformationに渡された関数が同期して呼び出されない場合でも、変数はであり、console.logが呼び出された時点でも変わりません。

つまり、アクセシビリティの問題ではなくタイミングの問題です。

関連する問題