chain promises in javascript

15,124

Solution 1

Looks like you understood promises wrong, re-read some tutorials on promises and this article.

As soon as you create a promise using new Promise(executor), it is invoked right away, so all your function actually are executed as you create them and not when you chain them.

createUser actually should be a function returning a promise and not a promise itself. createComment, createGame, createRoom too.

Then you will be able to chain them like this:

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

Latest versions of mongoose return promises if you don't pass callbacks, so you don't need to wrap it into a function returning a promise.

Solution 2

You should wrap your Promises into functions. The way you're doing, they are called right away.

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

Now you can chain Promises, like this:

createUserPromise()
.then(createCommentPromise)
.then(createGamePromise)
.then(createRoomPromise);
Share:
15,124
Epitouille
Author by

Epitouille

Updated on June 07, 2022

Comments

  • Epitouille
    Epitouille almost 2 years

    I've created many promises like that, in order to create object in my database.

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

    At the end, I want call all my promises in the order I want. (because somes object depend of other, so I need to keep that order)

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

    So I expect to see :

    User populated
    Comment populated
    Game populated
    Room populated
    

    Unfortunately, this messages are shuffled and I don't understand what.

    Thanks