Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 承诺中的回报声明_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 承诺中的回报声明

Javascript 承诺中的回报声明,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我正在为node.js中使用承诺的GET请求编写一个简单的控制器。代码是有效的,但我不确定为什么。我有一个getStoriesHelper函数,它返回一个承诺,在我得到结果后,它返回res.json(listOfStories)。这是可行的,但我的印象是,返回只会脱离单个函数范围(因此我认为它应该只脱离匿名函数范围),我只是想知道为什么它也会脱离getStories函数 //for instance, the return statement only breaks out of the ano

我正在为node.js中使用承诺的GET请求编写一个简单的控制器。代码是有效的,但我不确定为什么。我有一个getStoriesHelper函数,它返回一个承诺,在我得到结果后,它返回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;
}

你的代码之所以有效是因为

  • findOne
    getStoriesHelper
    是异步的,
    res
    仍然在它们的范围内

  • 语句
    return res.json(listOfStories)
    做两件事。它将响应写入输出流,并返回从未使用过的
    res.json()
    返回的值,因此事实上,如果不
    return
    ,函数就要返回了

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


  • 没有。外部功能已经结束
    res.json
    发送响应。另外,您应该先从
    内部返回承诺,然后从
    内部返回承诺,这样您就可以处理错误并发送响应,而不会让事情看起来像是回调。谢谢,这很有意义