2016-11-20 4 views
0

Mein Code funktioniert einwandfrei und ich kann einige Daten in der Datenbank erstellen, aber danach muss ich die letzte ID aus dieser Datei an anderer Stelle einfügen, aber diese Funktion die Rückkehr Versprechen Objekt exportiert, und ich kann nicht variabel als Funktion Ergebnis, zum Beispiel zu:Nodejs gibt das Ergebnis von Promis zurück und weist die Variable asynchron als Funktion zu

module.exports = { 
    createNewUser: function (model) { 
     return new Promise((resolve, reject) => { 
      return model.create(
       { 
        username: 'John' 
       }) 
       .then(function (result) { 
        return result.userUniqueId; 
       }) 
       .then(value => resolve(value)); 
     }); 
    }, 
}; 

Rückkehr Versprechen Objekt, und ich kann nicht zuweisen Variable zurückgegebene Ergebnis als

return result.userUniqueId; 

Ich möchte Ergebnis erhalten und drucken oder Variable zuweisen als das Ergebnis mit diesem Code:

console.log(controller.createNewUser(models.users)); 
+0

Vermeiden Sie die ['Promise' Konstruktor Antipattern] (http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergi Ich lese es neu, aber ich kann das Problem nicht lösen –

+0

Sie können nicht. Das Ergebnis ist nur asynchron verfügbar, Sie können es nicht von der Funktion zurückgeben. Verwenden Sie stattdessen 'controller.createNewUser (models.users) .then (console.log)' stattdessen. – Bergi

Antwort

0

Sezieren die Versprechen Semantik:

  • Es ist nur eine semantische Verschönerungs zwei oder mehr asynchronen Aufrufe.
  • Die Rückkehr von irgendwo in der Kette ist weder gültig noch sinnvoll.
  • Wie @Bergi darauf hinweist, bricht die Rückkehr von teilweise ausgeführten asynchronen Anrufen die Versprechenskette. Genauer gesagt, die Caller-Callee-Relation, die durch einen Rückgabewert gebunden ist, macht keine gültige Semantik, wenn Promise involviert ist.
  • Ausweg # 1: Erstellen Sie und versprechen Versprechen Transaktion zum Anrufer, und verwalten Sie den Rest der Kette im Aufrufer (hässlich).

  • Ausweg # 2: Visualisieren Sie das Versprechen als semantischen Wrapper um die alten asynchronen Aufrufketten, und behandeln Sie die Ergebnisverarbeitung im Blatt der Versprechungskette (empfohlen).

  • Fazit: Der Anrufer erhält kein Interesse an einem Anruf, bei dem der Angerufene an einem asynchronen Anruf teilnimmt.

Hoffnung, das hilft.

+0

ich über diesen Link als 'https denke: // x.st/javascript-Koroutinen /', das seine über 'Coroutine Event-Loops in Javascript' und ich denke, Ergebnis und weisen variable mit' co' oder Erzeugungsfunktion zurückkehren können, Was denkst du? –

1

ja, mit coroutines und yield können Sie tatsächlich die Ausführung einer Methode aussetzen und die Co-Funktion zurück an den Aufrufer zurückgeben, und der Aufrufer kann die Ausführung nach seinem Willen wieder aufnehmen, indem er das co-Funktionsobjekt mit einem übergebenen Argument verwendet Bruchteil der Routine - aber es gibt keine Möglichkeit für die Routine, eine halb gebackene Daten an den Aufrufer zurückgeben, noch macht es in diesem Zusammenhang Bedeutung: in Ihrem Code, bis Sie die eindeutigen IDs des Benutzers generieren, gibt es nichts Rückkehr zum Aufrufer, und die eindeutige ID-Generierung ist asynchron und endet erst, wenn alle Callbacks ausgeführt wurden. Kurz gesagt, der Coroutine-Anwendungsfall trifft hier nicht zu. Hoffe das klärt auf.

Verwandte Themen