2016-03-19 11 views
1

Ich versuche auf die Variable zuzugreifen, die global deklariert und innerhalb einer Callback-Funktion zugewiesen ist. Ich möchte auf den Wert außerhalb zugreifen. Gibt es eine Möglichkeit, das zu tun?nicht auf Variablen zugreifen kann innerhalb Callback-Funktion zugewiesen

, was ich versucht:

Knoten JS (ONVIF-Modul).

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)); 

Ich weiß, dass es wegen asynchroner Aufruf ist. Kann jemand den Code anschauen und einen besseren Weg beschreiben dies zu schreiben.

+1

Die Variablen sind außerhalb der Funktion zugänglich, aber vor dem Aufruf der Funktion wird ihr Wert "undefiniert" sein. – Tushar

+0

Es sieht so aus, als ob Ihr Callback niemals ausgeführt wird, oder dass 'b._' nicht definiert ist. Versuchen Sie, 'console.log (" Callback ", a, b, c)' im Callback-Body hinzuzufügen und sehen Sie, ob es herauskommt. Es ist auch möglich, dass 'cam.getDeviceInformation' asynchron arbeitet - es kann sofort zurückkommen, dann protokolliert undefineds, und dann wird der Callback aufgerufen. –

+1

'.getDeviceInformation' scheint Ergebnisse asynchron zurückzugeben, wobei' console.log() 'aufgerufen wird, bevor '.getDeviceInformation' Callback abgeschlossen wird? Sie könnten 'serialNumber' als Parameter an einen anderen Funktionsaufruf übergeben oder 'console.log()' oder eine andere Aufgabe innerhalb des 'getDeviceInformation' Callbacks ausführen? – guest271314

Antwort

0

Es ist möglich, aber wenn die an getDeviceInformation übergebene Funktion nicht synchron aufgerufen wird, sind die Variablen immer noch undefined zu dem Zeitpunkt, wenn Ihr console.log aufgerufen wird.

Mit anderen Worten - es ist kein Problem der Zugänglichkeit, sondern des Timings.

Verwandte Themen