在使用Q' deferred/promise时组合一个同步函数
Combining a synchronous function while using Q's deferred/promise
我正在用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)) {
.....
}
相关文章:
- 使用promise和mongoose对文档进行排序
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 测试Angular Service解决错误回调中的promise
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 组合两个javascript函数
- Telerik rad组合框多列数据绑定
- 节点协同与生成器和Promise并行流量控制
- 组合 2 个 JavaScript .scroll 函数
- 如何使用jquery组合两个数组
- 根据是否解析了 Promise 从函数返回值
- onChange不足以从Dojo组合框触发查询
- 将一个方法转换为promise:Nodejs
- 组合承诺和非承诺值
- 所有控件的组合框
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- 在D3中组合多个事件
- js promise没有正确关闭
- 组合多个API调用和处理后从工厂方法返回promise
- 在使用Q' deferred/promise时组合一个同步函数