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));
私はそれが非同期呼び出しによるものだと知っています。誰かがコードを見て、より良い方法でこれを書くことができますか?
変数は関数の外部からアクセスできますが、関数を呼び出す前に、その値は 'undefined'になります。 – Tushar
あなたのコールバックは実行されないか、 'b._'は未定義です。コールバック本体に 'console.log(" Calling callback "、a、b、c)'を追加して、それが出てくるかどうか確認してください。また、 'cam.getDeviceInformation'が非同期で動作する可能性もあります。即座に戻り、未定義を記録した後、コールバックが呼び出されます。 –
'.getDeviceInformation'コールバックが完了する前に' console.log() 'が呼び出されたところで、' .getDeviceInformation'は結果を非同期的に返すように見えますか?別の関数呼び出しにパラメータとして 'serialNumber'を渡すか、' console.log() 'や' getDeviceInformation'コールバック内の他のタスクを実行できますか? – guest271314