Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用q将此node.async代码转换为?我需要回信吗?_Javascript_Node.js_Asynchronous_Q - Fatal编程技术网

Javascript 如何使用q将此node.async代码转换为?我需要回信吗?

Javascript 如何使用q将此node.async代码转换为?我需要回信吗?,javascript,node.js,asynchronous,q,Javascript,Node.js,Asynchronous,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, submissi

在“视图”中,我的控制器中的方法以前使用的是
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
对数据库的调用?那你就不能把承诺“连锁”到那。您必须使用
延迟
方法:

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样式回调的函数(
函数(err,data)
)转换为基于承诺的函数。因此,上述也可以通过以下方式实现:

getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);

Submission.getSubmission
是对数据库的调用吗?那你就不能把承诺“连锁”到那。您必须使用
延迟
方法:

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样式回调的函数(
函数(err,data)
)转换为基于承诺的函数。因此,上述也可以通过以下方式实现:

getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);

混蛋,谢谢。我是否需要在每个范围内创建一个新的延迟?比如,如果我链接另一个调用来处理提交,比如getSubmissionViews,我会在该范围内创建一个新的延迟吗?或者将第一个签名传递给它?如果所有异步函数始终返回相同的签名(
function(err,data)
),则可以使用
getSubmissionAsPromise=Q.denodeify(Submission.getSubmission);getSubmissionAsPromise({id:123})。然后(successCallback,errorCallback)
。但是假设我使用了denodeify,然后在我的
中,
想调用GetCommentsasPromission({submissionId:submission.\u id}),但是您可以看到我将使用从第一个denodeify返回的对象中的提交id,我该怎么做?又称作让链条继续运转,不管你怎么想。需要返回getCommentsAsPromise()。混蛋,谢谢。我是否需要在每个范围内创建一个新的延迟?比如,如果我链接另一个调用来处理提交,比如getSubmissionViews,我会在该范围内创建一个新的延迟吗?或者将第一个签名传递给它?如果所有异步函数始终返回相同的签名(
function(err,data)
),则可以使用
getSubmissionAsPromise=Q.denodeify(Submission.getSubmission);getSubmissionAsPromise({id:123})。然后(successCallback,errorCallback)
。但是假设我使用了denodeify,然后在我的
中,
想调用GetCommentsasPromission({submissionId:submission.\u id}),但是您可以看到我将使用从第一个denodeify返回的对象中的提交id,我该怎么做?又称作让链条继续运转,不管你怎么想。需要返回GetCommentsAssociation()。