如何将此node.async代码转换为使用q? 我需要退还一个承诺吗?
在我的控制器内的“视图”方法以前使用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); });
但这并不是我想要的。 我在这里做错了什么? 我怎样才能做到这一点?
是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样式的callback( function(err, data)
)的函数转换为基于promise的函数。 因此,上述也可以通过以下来实现:
getSubmissionPromise = Q.denodeify(Submission.getSubmission); getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);