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()。