2016-05-06 6 views
-3

Wenn ich eine Variable deklarieren und Wert aus einer Methode zuweisen und außerhalb der Methode drucken. Aber es zeigt undefined. Mein Code ist,Wie kann ich globale und lokale Variablen im Knoten js zuweisen

var value; 
var getValue = function getValue(){ 
    value = 5; 
}; 
console.log(value); 

Ausgang,

undefined 

ich auch in globale Variable

versucht bin
var getValue = function getValue(){ 
    global.value = 5; 
}; 
console.log(value); 

Aber zeigt einige Fehler,

console.log(value); 
      ^

ReferenceError: value is not defined 
    at Object.<anonymous> (~/MyApp/test.js:8:13) 
    at Module._compile (module.js:413:34) 
    at Object.Module._extensions..js (module.js:422:10) 
    at Module.load (module.js:357:32) 
    at Function.Module._load (module.js:314:12) 
    at Function.Module.runMain (module.js:447:10) 
    at startup (node.js:146:18) 
    at node.js:404:3 
+1

Nun, müssen Sie die Funktion aufrufen, um den Wert –

+0

Mein Szenario ist, dass HTTP-Post-Aufruf innerhalb dieser Methode und bekommen einige Antwort muss ich diesen Wert in lokal speichern und kann ich diese Logik.? Wenn ich eine Methode aufgerufen habe, geht eine weitere Anfrage an diese Stelle. – jicks

Antwort

1

Ihr Problem ist, dass Sie warten nicht auf den Rückruf ausgeführt werden.

Statt

app.post('/authenticate', function(req, res) { 
    var userToken; 
    ... 
    amqHandler.reciveData(amqpConnection ,function(err,data){ 
     if(!err){ 
      httpRequestHandler. makeHttpRequest(data, function(err,userToken){ 
       global.apiResponce = JSON.parse(userToken).token; 
       global.convertedObjects = JSON.stringify(apiResponce); 
       console.log("convertedObjects==>"+convertedObjects); 
       userToken = {token:JSON.stringify(apiResponce)}; 
      }); 
     } 
    }); 
    res.send({msg:userToken}); // this is executed before the end of reciveData 
}); 

Sie müssen die Antwort von den Rückruf an die asynchrone Funktion übergeben senden:

app.post('/authenticate', function(req, res) { 
    ... 
    amqHandler.reciveData(amqpConnection ,function(err,data){ 
     if(!err){ 
      httpRequestHandler. makeHttpRequest(data, function(err,userToken){ 
       global.apiResponce = JSON.parse(userToken).token; 
       global.convertedObjects = JSON.stringify(apiResponce); 
       console.log("convertedObjects==>"+convertedObjects); 
       var userToken = {token:JSON.stringify(apiResponce)}; 
       res.send({msg:userToken}); // <=== send here 
      }); 
     } 
    }); 
}); 

Hinweis, dass es Konstrukte, insbesondere promises, die es einfacher machen, asynchrone Kettenrufe. Aber Sie müssen zuerst das Problem verstehen und sehen, wie Sie mit Callbacks umgehen können.

+0

Dieser Code funktioniert. Vielen Dank. – jicks

1

Ihre Funktion isn geh nicht g run, daher wird kein Wert gesetzt.

var value; 
var getValue = function getValue(){ 
    value = 5; 
}; 
getValue(); // call function to set value of 'value' 

console.log(value); 
2

In Ihrem ersten Beispiel wird Wert in der Funktion festgelegt, aber die Funktion wird nie aufgerufen. Daher ist der Wert undefined.

Im globalen Beispiel wird der Wert nie deklariert und somit nicht definiert.

Sie möchten getValue() aufrufen und dann Ihren Wert an die Konsole ausgeben.

Erstes Beispiel:

var value; 
var getValue = function(){ 
    value = 5; 
}; 
getValue(); 
console.log(value); // should return 5 

Globales Beispiel:

var global = {}; // create an object otherwise you get a 'global is not defined' error 
var getValue = function getValue(){ 
    global.value = 5; 
}; 
getValue(); 
console.log(global.value); // should return 5 
+0

Mein Szenario ist, dass http Post Aufruf innerhalb dieser Methode und erhalten einige Antwort muss ich diesen Wert in lokal speichern und kann ich diese Logik.? Wenn ich eine Methode aufgerufen habe, geht eine weitere Anfrage an diese Stelle. – jicks

+0

lokal relativ zur Funktion? Entschuldigung, ich bin nicht sicher, ob ich folge – pll33