如何将此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);