在“视图”方法中,我的控制器以前使用的是node-async,但我想尝试使用q。
我现在正试着把这个
exports.view = function (req, res) {
var category = req.params.category,
id = req.params.id,
ip = req.connection.remoteAddress,
slug = req.params.slug,
submission,
userId = typeof req.session.user !== 'undefined' && req.session.user.id ? req.session.user.id : null,
views;
var getSubmission = function (submissionId, callback) {
Submission.getSubmission({
id: submissionId
}, function (err, submission) {
if (err) {
callback(err);
} else if (submission) {
callback(null, submission);
} else {
callback(err);
}
});
};
async.waterfall([
function (callback) {
getSubmission(id, callback);
},
function (submission, callback) {
res.render('submission', {
title: submission.title + ' -',
submission: submission
});
}]);使用q..。我开始做类似这样的事情:
var getSubmission = function(id) {
return Submission.getSubmission({
id : submissionId
}).then(function(submission) {
return submission;
});
};
q.fcall(getSubmission).then(function(submission) {
console.log(submission);
});但它并不完全像我预期的那样工作。我是不是做错了什么?我该怎么做呢?
发布于 2013-06-07 13:20:35
Submission.getSubmission是对数据库的调用吗?那么你就不能把承诺“链”到那上面去。您必须使用deferred方法:
var getSubmission = function(id) {
var deferred = Q.defer();
Submission.getSubmission({
id: id
}, function(err, data){
if (err) {
deferred.reject(err);
} else {
deferred.resolve(data);
}
});
return deferred.promise;
}
getSubmission(some_id).then(successCallback, failureCallback); 您还可以使用Q#denodeify将使用NodeJS式回调(function(err, data))的函数转换为基于promise的函数。因此,上述功能也可以通过以下方式实现:
getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);https://stackoverflow.com/questions/16975719
复制相似问题