gpt4 book ai didi

javascript - 如何将此node.async代码转换为使用q?我需要返回 promise 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:11:26 25 4
gpt4 key购买 nike

在我的 Controller 内的“view”方法中,之前使用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 是对数据库的调用吗?那么你就不能将 promise “链接”到它上面。您必须使用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 样式回调的函数 (function(err, data)) 转换为基于 Promise 的函数。因此,上述也可以通过以下方式实现:

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

关于javascript - 如何将此node.async代码转换为使用q?我需要返回 promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com