【问题标题】:Combining a synchronous function while using Q's deferred/promise在使用 Q 的 deferred/promise 时结合同步函数
【发布时间】:2013-06-05 05:07:34
【问题描述】:

我正在使用 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

我需要把它变成一个承诺吗?可能不是因为我只是循环(同步)通过一个集合?哈普请。

【问题讨论】:

    标签: javascript node.js callback promise q


    【解决方案1】:

    问题中没有任何内容表明 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)) {
        .....
    }
    

    【讨论】:

    • 啊,是的,我想我已经为此工作了一整天,最简单的事情就是让我发疯。谢谢!
    • 鲍勃,有时候就是这样。发生在我们所有人身上。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多