2015-03-13 76 views
1

對不起,如果標題太模糊,我不確定如何更好地解釋它。這兩個函數調用爲什麼不相等?

爲什麼在這種情況下使用匿名函數調用的工作:

Team 
    .findAll() 
    .then(function(teams) { 
     res.send(teams); 
    }); 

但直接傳遞res.send.then(),這是行不通的:

Team 
    .findAll() 
    .then(res.send); 

這導致了這個錯誤:

Possibly unhandled TypeError: Cannot read property 'method' of undefined 
    at res.send (/opt/web/projects/node_modules/express/lib/response.js:83:27) 
    at Promise._settlePromiseAt (/opt/web/projects/node_modules/sequelize/lib/promise.js:76:18) 
    at process._tickCallback (node.js:442:13) 

這兩個不相等嗎? res.send只接受一個參數,所以它不像它傳遞一些奇怪的未知參數到函數中。

+0

你已經得到了你的答案,但這裏是一個函數對象成員傳遞給點擊處理函數的例子,它演示了你可以傳遞一個javascript對象的屬性作爲回調http://jsfiddle.net/bknjaf6k/ – Zack 2015-03-13 17:44:53

回答

4

.then()方法期望您傳遞一個函數,因爲它(最終)會去調用它。如果你只是傳遞一個(非函數)值,那不可能發生。

撥打電話.then()的意思是說,「當操作完成後,請做這個。」

編輯 —啊好吧,對不起。在這種情況下,問題是當您通過res.send時,send方法將丟失上下文。也就是說,當Promise機制調用send函數時,它不會知道res的值。

你可以這樣做:

.then(res.send.bind(res)) 

通過這樣做,可以確保當send最終調用時,它會被稱爲這樣this將是你的res對象的引用。

+2

但'res.send'是一個函數,所以不應該只是調用它? – 2015-03-13 17:36:44

+0

@RalphWiggum它是一個看起來像你在工作代碼中傳入的回調函數嗎?可能不會吧? – Pointy 2015-03-13 17:37:22

+0

@RalphWiggum看到我的更新 - 我錯過了一個重要的細節。 – Pointy 2015-03-13 17:39:00

相關問題