在使用Q' deferred/promise时组合一个同步函数

Combining a synchronous function while using Q's deferred/promise

本文关键字:组合 promise 合一 函数 同步 deferred      更新时间:2023-09-26

我正在用Q库做一堆延迟/承诺,它工作得很好,但是一旦我在一个链式回调中获得了一些数据,我想以某种方式操纵它。

   var getFavorites = function(submissionId) {
  deferred = Q.defer();
  Submission.getFavorites({
    submissionId : submissionId
  }, function(err, favorites) {
    if (err) {
      deferred.reject(err);
    } else {
      deferred.resolve(favorites);
    }
  });
  return deferred.promise;
};
var didUserFavorite = function(favorites) {
  var didUserLike;
  deferred = Q.defer();
  favorites.forEach(function(favorite) {
    if (favorite.user_id === userId) {
      didUserLike = true;
      deferred.resolve(didUserLike);
    } else {
      didUserLike = false;
      deferred.resolve(didUserLike);
    }
  });
  return deferred.promise;
};
getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getCommentsPromise = Q.denodeify(Submission.getComments);
getViewsCountPromise  = Q.denodeify(Submission.getViewsCount);
getCommentLikesPromise = Q.denodeify(Submission.getCommentLikes);
getFavoritesPromise = Q.denodeify(Submission.getFavorites);
getSubmissionPromise({ id: id }).then(function(submission) {
  var submissionId = submission._id.toString();
  return getViewsCountPromise({ submissionId : submissionId }).then(function(viewsCount) {
    return getFavoritesPromise({ submissionId : submissionId }).then(function(favorites) {

      // WANT TO MANIPULATE IT HERE:
      //return didUserFavorite({ favorites : favorites }).then(function(didUserFavorite) {

        return getCommentsPromise({ submissionId : submissionId }).then(function(comments){
          return getCommentLikesPromise({ submissionId : submissionId }).                        then(function(commentLikes) {
            comments.forEach(function(comment) {
              var likes = _.where(commentLikes, { comment_id : comment._id.toString() }),
                  likeUserId;
              likes.forEach(function(like) {
                likeUserId = like.user_id.toString();
                if (likeUserId === userId) {
                  comment.didUserLike = true;
                  comment.userLikeId = like._id.toString();
                }
              });
              if (likes && likes !== 'undefined') {
                comment.likes = likes;
              }
            });
            renderSubmission(submission, comments, viewsCount, favorites);
          });
        });
    //  });
    });
  });

所有承诺都有效,但我想调用didUserFavorite,然后让它继续到下一个延迟/承诺,即getCommentsPromise

我需要把它放进承诺里吗?可能不是,因为我只是循环(同步)通过一个集合?想买请。

问题中没有任何东西表明didUserFavorite()不是同步的,因此返回true/false应该足够了。

可能是这样的:

var didUserFavorite = function(favorites) {
    favorites.forEach(function(favorite) {
        if (favorite.user_id === userId) {
            return true;
        }
    });
    return false;
};

getSubmissionPromise()内部,你可以这样调用didUserFavorite():

if(didUserFavorite(favorites)) {
    .....
}