我正在为使用promises的node.js中的GET请求编写一个简单的控制器。代码有效,但我不是百分之百确定原因。我有一个返回promise的getStoriesHelper函数,在得到结果后,它会return res.json(listOfStories);
。这是有效的,但我的印象是返回只会突破单个函数范围(所以我认为它应该只是打破匿名函数范围),并且只是想知道为什么它会突破getStories函数呢?
//for instance, the return statement only breaks out of the anonymous function and not from dummy()
function dummy() {
_.map([1, 2, 3], function(element) {
return element * 2;
}
}
//node.js controller
exports.getStories = function(req, res) {
var studentId = req.params.studentId;
User.findOne({role: 'student', _id: studentId}).exec()
.then(function(student) {
var isNursery = student.status === 'attending class' && user.bookLevel === 'nursery';
getStoriesHelper(student, isNursery).then(function(listOfStories) {
//shouldn't return only break out of this inner function scope
return res.json(listOfStories)
});
});
};
//dummy async code
function getStoriesHelper() {
var deferred = Q.defer();
setTimeout(function() {
deferred.resolve(123)
}, 3000);
return deferred.promise;
}
答案 0 :(得分:1)
您的代码有效,因为
findOne
和getStoriesHelper
是异步的,res
仍在其中。
声明return res.json(listOfStories)
做了两件事。它将响应写入输出流,并返回从未使用的res.json()
返回的值,因此实际上如果不return
则不会有害,该函数即将返回已经
getStories
函数在您调用异步函数时已经结束,因此不要认为内部return
在匿名函数之外有任何影响。