2016-11-21 3 views
-1

Ich bin nicht so vertraut mit Versprechungen. Ich möchte Versprechen-Implementierung von Versprechen-Aufruf verbergen.Versprechen Anruf getrennt von Versprechen-Auflösung

Beispiel:

function findFriends(req, res) { 

    const promiseFriend = MyFriendes.find({}).exec(); //call promise 

    if(friends.length===0){ 
     logger.warn('No friendsavailible'); 
    }else if(friends === undefined){ 
     res.status(500).json({ 
      error: 'INTERNAL ERROR' 
     }); 
    }else{ 
     res.status(200).json({ 
      friends: friends 
     }); 
    } 
} 

und ich werde mein Versprechen innerhalb derselben Datei aber nicht in derselben Funktion beheben, wo ich dieses Versprechen nennen.

promiseFriend 
     .then(function(friends){ 
      return friends; 
     }) 
     .catch(function(err){ 
      logger.error({error:err}); 
     }); 

Jetzt bekomme ich, dass "PromiseFriend" undefined ist. Wie kann ich Versprechen-Versprechen von Versprechen-Auflösung trennen?

+0

Könnten Sie mehr Code posten? Wo nennst du 'findFriends' und wo nennst du das Versprechen genau? Eine Sache, die ich Ihnen über die Versprechungen sagen könnte - solange Sie nicht "then" irgendwo in Ihrem Code nennen, Versprechen wird nicht gelöst werden. Und nach der Auflösung können Sie das selbe 'then' so oft wie gewünscht aufrufen und es werden die gleichen Werte (bereits aufgelöst) zurückgegeben. provideFriend ist undefiniert hat nichts mit Versprechen - es bedeutet nur, dass an der Stelle, wo Sie das Versprechen nennen diese Variable nicht definiert ist. – SzybkiSasza

Antwort

3

Wenn Sie ein Versprechen in einer Funktion definieren und es woanders verwenden möchten, müssen Sie zunächst das Versprechen aus der Funktion zurückgeben, die Sie in Ihrem Code nicht machen. Dann müssen Sie diese Funktion tatsächlich aufrufen, die Sie auch nicht tun. Und schließlich müssen Sie einen then Callback auf den zurückgegebenen Wert verwenden, was Sie auch in diesem Fall nicht tun.

Es hat keinen Sinn, das Versprechen in einer lokalen Variablen promiseFriend zu speichern, die auf diese Funktion beschränkt ist. Es gibt auch keinen Grund, einen Wert in Ihrem then Rückruf zurückgeben: .then(function (friends) { return friends; }) - Ich habe keine Ahnung, was hier versucht haben.

Ich nehme an, dass findFriends ein Route-Handler für Express sein soll. Wenn ja, stellen Sie sicher, dass Sie in jedem Fall eine Antwort senden (was Sie nicht für friends.length===0 tun). Außerdem müssen Sie dem gespeicherten Versprechen tatsächlich einen then -Handler hinzufügen, wenn Sie nach der Lösung handeln möchten. Im Moment haben Sie nicht einmal friends in Ihrer Funktion definiert. Fügen Sie auch einen catch Handler hinzu und senden Sie auch eine Antwort für diesen Fall.

Dann könnten Sie das Versprechen von Ihrer Funktion zurückgeben, aber nicht, wenn es eine Route-Handler ist, macht es keinen Sinn. Sie können ein Versprechen aus einer Funktion zurückgeben:

function x() { 
    return MyFriendes.find({}).exec(); 
} 

und dann verwenden:

x().then(friends => ...).catch(error => ...); 

aber man kann nicht Rückgabewerte verwenden, wenn Sie es nicht zurückkehren, können Sie keine undefinierten Variablen verwenden, wie wenn sie definiert wurden, und Sie müssen tatsächlich überlegen, an wen der Rückgabewert zurückgegeben wird.

Ich schlage vor, dass Sie lernen, wie Knoten tatsächlich funktioniert, weil es scheint, dass Sie einige zufällige Code kopiert und eingefügt haben, zusammengefügt und erwarten, dass es tut, was Sie wollen, ohne tatsächlich zu versuchen, es zu verstehen.

Um ein besseres Verständnis über die asynchrone Natur von Knoten zu erhalten, die hier diese Ausführungsreihenfolge wird zu geben, finden Sie die Antworten:

Versuchen Sie nicht, Node prog zu schreiben Rams, bevor Sie das Konzept der Funktionsaufrufe, Rückgabewerte, Rückrufe und in diesem Fall Versprechungen verstehen.

+0

thx. zur Erklärung. Ich habe nur einfache Beispiele von Versprechungen gesehen, aber wenn ich komplizierter werde, würde ich gerne sehen, wie es gestaltet werden könnte. –