承诺中的退货声明

时间:2014-09-25 14:51:14

标签: javascript node.js mongoose

我正在为使用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;
}

1 个答案:

答案 0 :(得分:1)

您的代码有效,因为

  1. findOnegetStoriesHelper是异步的,res仍在其中。

  2. 声明return res.json(listOfStories)做了两件事。它将响应写入输出流,并返回从未使用的res.json()返回的值,因此实际上如果不return则不会有害,该函数即将返回已经

  3. getStories函数在您调用异步函数时已经结束,因此不要认为内部return在匿名函数之外有任何影响。