2013-11-04 86 views
0

我有一個帖子和一組用戶的集合。在返回帖子列表時,我想解析對用戶的引用。這意味着要爲每行用戶進行異步調用。當修士返回承諾時,它會返回響應「完成」或「成功」的內容。 Q期望迴應「那麼」。我需要使用Q.all來等待所有的用戶進入帖子,但是我不能讓它和僧侶的承諾風格發揮得很好。讓和尚與Q.all玩好

這是我的嘗試。

exports.posts = function (req, res) { 
    req.posts.find() 
     .complete(function(err, posts) { 
     handle(err, res, posts); 
     var postsWithUsers = posts.map(function(post) { 
      return req.users.findOne({_id: post.userId}).complete(function(err, result) { 
      post.user = result; 
      }); 
     }); 
     Q.all(postsWithUsers.map(function(monkPromise) { 
      monkPromise.then = monkPromise.complete 
     }), function(err, results) { 
      console.log("done with all posts"); 
     }); 
    }); 
}; 

回答

0

只爲其他人。這是一個解決方案,可能不是最好的。

exports.posts = function (req, res) { 
    req.posts.find() 
     .complete(function(err, posts) { 
     handle(err, res, posts); 
     var postsWithUsers = posts.map(function(post) { 
      var deferred = Q.defer(); 
      return req.users.findOne({_id: post.userId}).complete(function(err, result) { 
      post.user = result; 
      deferred.resolve(result); 
      }); 
      return deferred.promise; 
     }); 
     Q.all(postsWithUsers, function(err, results) { 
      console.log("done with all posts"); 
     }); 
    });