2016-01-09 123 views
5

我已經創建了許多類似的承諾,以便在我的數據庫中創建對象。在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(); 
    }); 
    } 
); 

最後,我想按我想要的順序打電話給我所有的承諾。 (因爲薩姆對象依賴其他,所以我需要保持這個順序)

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

所以我希望看到:

User populated 
Comment populated 
Game populated 
Room populated 

不幸的是,這個消息被打亂,我不明白。

謝謝

+0

注 - 貓鼬已經返回承諾 - 您的代碼應該有「新的承諾」完全零次。請參閱stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it和http://mongoosejs.com/docs/promises.html –

回答

10

看起來你理解錯的承諾,重新閱讀上的承諾,這article一些教程。

只要您使用new Promise(executor)創建承諾,就立即調用它,這樣所有的函數實際上都會在創建時執行,而不是在鏈接它們時執行。

createUser實際上應該是一個返回承諾而不是承諾本身的函數。 createCommentcreateGamecreateRoom

然後,你就可以把它們連這樣的:

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

最新的版本mongoose return promises如果不通過回調,這樣你就不會需要將其包裝成返回承諾的功能。

+0

你是對的,我做錯了。我改變了我的代碼,一切順利。由於解釋,我接受你的回答。謝謝你 – Epitouille

+1

只是一個小小的修復....你忘了'createUser'的括號,因爲它是一個函數。 – juliobetta

+0

@juliobetta好抓! – nvartolomei

3

你應該把你的承諾包裝成函數。你正在做的事情,他們馬上就會被調用。

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

現在你可以鏈的承諾,像這樣:

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

這不是鏈接,看看這個http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – nvartolomei

+0

你是對的。更新! – juliobetta