2016-01-09 13 views
5

Ich habe viele Versprechen wie diese erstellt, um ein Objekt in meiner Datenbank zu erstellen.Kette verspricht in Javascript

Am Ende möchte ich alle meine Versprechen in der Reihenfolge, die ich will. (Weil somes Objekt von anderen abhängig sind, so muss ich diese Ordnung halten)

createUserPromise 
    .then(createCommentPromise 
    .then(createGamePromise 
     .then(createRoomPromise))); 

So erwarte ich, um zu sehen:

User populated 
Comment populated 
Game populated 
Room populated 

Leider ist diese Nachrichten gemischt werden, und ich verstehe nicht, was.

Dank

+0

Hinweis - mongoose bereits verspricht - Ihr Code sollte "New Promise" genau null mal haben. Siehe stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it und http://mongoosejs.com/docs/promises.html –

Antwort

10

Sieht aus wie Sie verspricht falsch verstanden, neu zu lesen einige Tutorials auf Versprechungen und dieser article.

Sobald Sie ein Versprechen mit new Promise(executor) erstellen, wird es sofort aufgerufen, so dass alle Ihre Funktionen tatsächlich ausgeführt werden, während Sie sie erstellen und nicht, wenn Sie sie verketten.

createUser eigentlich sollte eine Funktion sein, die ein Versprechen und nicht ein Versprechen selbst zurückgibt. createComment, createGame, createRoom auch.

Dann werden Sie in der Lage sein, zu verketten sie wie folgt aus:

createUser() 
.then(createComment) 
.then(createGame) 
.then(createRoom) 

Die neuesten Versionen von mongoose return promises wenn Sie nicht Rückrufe passieren, so dass Sie es in eine Funktion nicht wickeln müssen ein Versprechen zurück.

+0

Sie hatten Recht, ich habe es falsch gemacht. Ich habe meinen Code geändert und alles geht gut. Ich nehme an, du antwortest wegen der Erklärung. Danke dir – Epitouille

+1

Nur ein wenig fix .... du hast die Klammer auf 'createUser' vergessen, da es eine Funktion ist. – juliobetta

+0

@juliobetta guten Fang! – nvartolomei

3

Sie sollten Ihre Versprechen in Funktionen verpacken. So wie du es machst, werden sie sofort gerufen.

var createUserPromise = function() { 
    return new Promise(
    function(resolve, reject) { 
     User.create({ 
     email: '[email protected]' 
     }, function() { 
     console.log("User populated"); // callback called when user is created 
     resolve(); 
     }); 
    } 
); 
}; 

Jetzt können Sie Kette Promises, wie folgt aus:

createUserPromise() 
.then(createCommentPromise) 
.then(createGamePromise) 
.then(createRoomPromise); 
+1

Dies ist nicht Verkettung, werfen Sie einen Blick auf diese http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – nvartolomei

+0

Sie haben Recht. aktualisiert! – juliobetta