2014-09-25 108 views
0

我在使用promise的node.js中为GET请求写了一个简单的控制器。该代码的作品,但我不是100%确定为什么。我有一个getStoriesHelper函数返回一个承诺,并在得到结果后,它的确可以做到return res.json(listOfStories);。这是有效的,但我的印象是,返回只是打破了单个函数作用域(所以我认为它只应该跳出匿名函数作用域),并且只是想知道为什么它会突破getStories函数呢?在promise中返回声明

//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

它没有。外部功能已经结束。 'res.json'发送一个响应。另外,你应该从'then's内部返回promise,这样你就可以处理错误并发送响应,而不需要基于回调的东西。 – Ryan 2014-09-25 14:58:49

回答

1

你的代码的工作,因为

  1. findOnegetStoriesHelper是异步的,res仍然是在它们的范围。

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

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

+0

谢谢,这是有道理的 – 2014-09-25 17:32:42