首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将此node.async代码转换为使用q?我需要退回一个承诺吗?

如何将此node.async代码转换为使用q?我需要退回一个承诺吗?
EN

Stack Overflow用户
提问于 2013-06-07 11:19:10
回答 1查看 902关注 0票数 1

在“视图”方法中,我的控制器以前使用的是node-async,但我想尝试使用q

我现在正试着把这个

代码语言:javascript
复制
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..。我开始做类似这样的事情:

代码语言:javascript
复制
var getSubmission = function(id) {
  return Submission.getSubmission({
    id : submissionId
  }).then(function(submission) {
    return submission;
  });
};

q.fcall(getSubmission).then(function(submission) {
  console.log(submission);
});

但它并不完全像我预期的那样工作。我是不是做错了什么?我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-07 13:20:35

Submission.getSubmission是对数据库的调用吗?那么你就不能把承诺“链”到那上面去。您必须使用deferred方法:

代码语言:javascript
复制
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的函数。因此,上述功能也可以通过以下方式实现:

代码语言:javascript
复制
getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16975719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档