javascript中的链承诺

时间:2016-01-09 17:34:38

标签: javascript node.js mongoose promise

为了在我的数据库中创建对象,我已经创建了许多类似的承诺。

var createUserPromise = new Promise(
  function(resolve, reject) {
    User.create({
      email: 'toto@toto.com'
    }, 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

不幸的是,这些消息被洗牌,我不明白。

谢谢

2 个答案:

答案 0 :(得分:15)

看起来你理解承诺是错误的,重新阅读一些有关承诺和article的教程。

只要您使用new Promise(executor)创建承诺,就会立即调用它,因此您的所有函数实际上都会在您创建它们时执行,而不是在链接它们时执行。

createUser实际上应该是一个返回promise而不是promise本身的函数。 createCommentcreateGamecreateRoom也是。

然后你就可以像这样链接它们了:

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

如果你没有传递回调,mongoose return promises的最新版本,所以你不需要将它包装成一个返回一个promise的函数。

答案 1 :(得分:3)

你应该将你的Promise包装成函数。你正在做的方式,他们马上打电话。

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

现在你可以链接Promises,就像这样:

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