2014-09-25 154 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