JavaScript Variable aus einem Befehl returnen

Cr41s3

Ensign
Registriert
Dez. 2012
Beiträge
246
Hallo zusammen.

Ich habe aktuell ein wahrscheinlich simples Problem, aber finde keine Lösung und ich lerne aktuell noch.

Ich habe folgenden Code:
Code:
server.get('/user/:id', function (req, res, next) {
    console.log("GET");
    bucket.get('users:'+req.params.id, function(err, res) {
      if(res == null) {
          console.log("NULL" + req.params.id);
      }
      else {
          console.log('ID: ', JSON.parse(res.value).id);
      }
    });
    //res.end(JSON.parse(res.value));
  return next();
});
Also führe ich in der einen function (server.get) noch eine function(bucket.get) aus.
Nun möchte ich eine Variable aus bucket.get returnen, so dass ich sie in server.get noch verwenden kann.

Ist wahrscheinlich ganz einfach.

MfG-
 
Sollte doch ganz trivial funktionieren: variable = function(){return value;};
 
Habe das ganze nun so.

Code:
server.get('/user/:id', function (req, res, next) {
    console.log("GET");
    var temp;
    bucket.get('users:'+req.params.id, temp = function(err, res) {
      if(res == null) {
          console.log("NULL" + req.params.id);
          return "a";
      }
      else {
          console.log('ID: ', JSON.parse(res.value).id);
          return JSON.parse(res.value).id;
      }
    });
    console.log(temp);
    delete(temp);
    //res.end(JSON.parse(res.value));
    return next();
});

In der Konsole steht nur
 
Ich hätte eher daran gedacht, den Return-Wert von bucket.get() zu speichern...
Ansonsten könntest du auch die Holzhammermethode verwenden: Definier eine "globale" Variable, in die du den Mist schreibst. Pack irgendwo außerhalb & vor deinen Funktionen ein "var temp;" rein.
 
Autsch... das tut ein wenig weh was man da liest. Du solltest am besten Javascript Grundlagen durchgehen bevor du dich an etwas wie NodeJS wagst (dass durch die Asynchronen Calls auch für nicht Anfänger verwirrent sein kann).

Code:
[..]
bucket.get('users:'+req.params.id, temp = function(err, res) {
[..]

Was du hier machst ist nur der Variable temp die function die du definierst zuzuweisen. (und damit auch die function automatisch als 2. Parameter der get function zu übergeben).

Die ganz wichtige Frage ist, was macht die bucket.get function. Ist es ein normaler functions aufruf (also synchron) oder wird hier wieder ein asynchroner call durchgeführt. Bei 1. könntest du in der function die du an dieses get übergibst einfach

Code:
temp = JSON.parse(res.value).id;

schreiben und du hättest das Ergebnis auch in der server.get function zur Verfügung. Wenn das aber ein async call ist (was ich eher vermuten würde) wirst du um Promises (Q) odg. nicht herumkommen (oder andere Kniffe - jenachdem was du erreichen willst) da die Function die du an das bucket.get übergibst erst irgendwann aufgerufen werden könnte und die Function die du an servert.get übergeben hast schon längst fertig sein kann bzw. sein wird.
 
Okey danke.

Die Funktion wird eigentlich direkt ausgeführt.
Die Funktion holt ein Dokument aus einer Datenbank(NoSQL - Couchbase).

Aber so wie es aussieht, handelt es sich um einen asynchronen call.

Edit: Ja bin halt ein blutiger Anfänger in JS und NodeJS.
Versuche aber aktuell mir beides anzulernen.
 
Zuletzt bearbeitet:
Du hast hier halt zwei "asynchrone" Funktionen. Der zweite Parameter für server.get und bucket.get ist ein Callback, dir irgendwann in der Zukunft aufgerufen wird. Nodes API nutzt diesen "Continuation-Passing Style" überall, denn beim warten wird der JavaScript-Thread nicht geblockt, nur ist der Style nicht unbedingt schön :D
Man könnte hier mit Promises Arbeiten, nur muss man dafür erstmal die asynchrone Verarbeitung in JavaScript (per Eventloop) verstehen, dann am besten noch wie "Closures" in JavaScript funktionieren und dann wie Promises funktionieren.
Ohne Promises geht es durchaus auch. Du muss halt jeden weiteren Code in den Callback von bucket.get schreiben. "req", "res" und "next" kannst du da immer noch verwenden (wegen den Closures in JavaScript).
Promises machen den Code natürlich schöner. Damit hat man nämlich eine Funktion, welche einen "asynchronen" Wert zurück gibt. Um das wirklich zu verstehen braucht man aber ordentlich Ahnung von JavaSciprt's Grundlagen.
Ich hab hier mal ein Haufen Begriffe in den Raum geworfen. Vllt. hilft das beim lernen :D
 
T0a5tbr0t schrieb:
Du hast hier halt zwei "asynchrone" Funktionen. Der zweite Parameter für server.get und bucket.get ist ein Callback, dir irgendwann in der Zukunft aufgerufen wird. Nodes API nutzt diesen "Continuation-Passing Style" überall, denn beim warten wird der JavaScript-Thread nicht geblockt, nur ist der Style nicht unbedingt schön :D
Man könnte hier mit Promises Arbeiten, nur muss man dafür erstmal die asynchrone Verarbeitung in JavaScript (per Eventloop) verstehen, dann am besten noch wie "Closures" in JavaScript funktionieren und dann wie Promises funktionieren.
Ohne Promises geht es durchaus auch. Du muss halt jeden weiteren Code in den Callback von bucket.get schreiben. "req", "res" und "next" kannst du da immer noch verwenden (wegen den Closures in JavaScript).
Promises machen den Code natürlich schöner. Damit hat man nämlich eine Funktion, welche einen "asynchronen" Wert zurück gibt. Um das wirklich zu verstehen braucht man aber ordentlich Ahnung von JavaSciprt's Grundlagen.
Ich hab hier mal ein Haufen Begriffe in den Raum geworfen. Vllt. hilft das beim lernen :D

War auf jeden Fall verständlich, danke dir.
Das Problem ist, dass ich auf res von server.get zurückgreifen muss (am Besten nun mal im bucket.get Teil).
Aber wie ich sehe muss ich doch erst JavaScript lernen.
Auf vielen Seiten Stand nur, dass JavaScripts Basics nicht unbedingt benötigt werden.

MfG-
 
Zurück
Oben