2016-01-09 13 views
5

Ho creato molte promesse del genere, al fine di creare oggetti nel mio database.promesse di catena in javascript

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

Alla fine, voglio chiamare tutte le mie promesse nell'ordine che voglio. (Perché somes oggetto dipende di altri, quindi ho bisogno di mantenere questo ordine)

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

quindi mi aspetto di vedere:

User populated 
Comment populated 
Game populated 
Room populated 

Purtroppo, questi messaggi vengono mescolate e non capisco che cosa.

Grazie

+0

Nota: la mangusta restituisce già promesse: il codice dovrebbe avere "nuova promessa" esattamente zero volte. Vedere stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it e http://mongoosejs.com/docs/promises.html –

risposta

10

Sembra che avete capito promesse sbagliate, rileggere alcuni tutorial su promesse e questo article.

Non appena si crea una promessa utilizzando new Promise(executor), viene richiamato subito, quindi tutte le tue funzioni vengono effettivamente eseguite mentre le si crea e non quando le si concentra.

createUser in realtà dovrebbe essere una funzione che restituisce una promessa e non una promessa stessa. createComment, createGame, createRoom.

Allora si sarà in grado di loro catena come questo:

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

più recenti versioni di mongoose return promises se non si passa callback, quindi non c'è bisogno di avvolgerlo in una funzione che restituisce una promessa.

+0

Avevi ragione, ho sbagliato. Ho cambiato il mio codice e tutto va bene. Accetto la tua risposta a causa della spiegazione. Grazie mille – Epitouille

+1

Solo una piccola correzione .... hai dimenticato la parentesi su 'createUser', dato che è una funzione. – juliobetta

+0

@juliobetta buona cattura! – nvartolomei

3

Si dovrebbe avvolgere le promesse in funzioni. Come stai, vengono chiamati subito.

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(); 
     }); 
    } 
); 
}; 

Ora è possibile Promesse a catena, come questo:

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

Questo non è concatenare, dai un'occhiata a questo http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – nvartolomei

+0

hai ragione. aggiornato! – juliobetta

Problemi correlati