2014-04-27 62 views
0

我有一個簡單的函數,它傳遞HTTP查詢模式,查詢redis併發送響應。以下是代碼Javascript替代項此對象

router.get('/getinfo/:teamname', function main(teamname) { 

    rclient.hgetall(teamname,function(err,obj){ 
     console.log("the response from redis is ",obj) 
     cache.put(eventname,obj); 
     console.log("inserting to cache"); 
     this.res.end(obj); // this object is root cause for all problems 
    }); 
} 

路由器對象afaik使用this.res.end(obj)發送響應。我想因爲我正在嘗試在我的redis客戶端中執行此操作,所以出現錯誤。有沒有其他方式發送價值作爲迴應?我想到了使用基於發射器的模型,其中通道發出響應並且偵聽器得到它。但感覺就像解決這個問題的一個方法。有沒有更簡單的方法?

+0

是否有'res'可用於任何附帶的函數中? – thefourtheye

+0

請記住,JavaScript是異步的。所以,在你的回調中「這個」可能不是這個「你」,除非是這樣。也許它是從'rclient'對象內引用'this'。 – alpham8

回答

1

錯誤可能是因爲,在您嘗試使用this時,它沒有預期的值 - 具有res屬性的對象,該對象又具有end()方法。

這將是因爲JavaScript中的每個function都有其自己的值this。並且,在嵌套function時,使用this將返回最接近的function的值(即shadowing)。

要解決,你可以預期的值保存到一個局部變量:

router.get('/getinfo/:teamname', function main(teamname) { 
    var request = this; 

    rclient.hgetall(teamname,function(err,obj){ 
     // ... 
     request.res.end(obj); 
    }); 
}); 

或者,bind匿名回調所以無論function s的被迫具有相同的this值:

router.get('/getinfo/:teamname', function main(teamname) { 
    rclient.hgetall(teamname, function(err,obj){ 
     // ... 
     this.res.end(obj); 
    }.bind(this)); 
}); 
+0

綁定選項太冷了。它拯救了我的一天..!萬分感謝! – Rahul