我有一個管理少量請求的類。所以請求被設置爲一個集合。我這樣做是爲了避免編寫冗長的開關/ if語句。在JavaScript中使用函數/類作爲「值」的含義地圖()
// Manager class
class makeManagerRequests() {
private list = [];
private createList(body) {
this.list.push(body)
}
createEmployee(body) {
this.createlist(body);
}
updateManager(body);
deleteManager(body);
}
// Employee class
class makeEmployeeRequests() {
private list = [];
private createList(body) {
this.list.push(body)
}
createEmployee(body) {
this.createlist(body);
}
updateEmployee(body)
deleteEmployee(body)
}
// Usage in a generic widget
class makeRequests() {
requestMap = new Map();
constructor(makeManagerRequests, makeEmployeeRequests) {
}
createRequestMap() {
requestMap.set('createManager', this.makeManagerRequest.createManager.bind(this));
requestMap.set('updateManager', this.makeManagerRequest.updateManager.bind(this));
requestMap.set('deleteManager', this.makeManagerRequest.deleteManager.bind(this));
requestMap.set('createEmployee', this.makeManagerRequest.createEmployee.bind(this));
requestMap.set('updateEmployee', this.makeManagerRequest.updateEmployee.bind(this));
requestMap.set('deleteEmployee', this.makeManagerRequest.deleteEmployee.bind(this));
}
makeRequest(data) {
let req = requestMap.get(data.requestType);
req(data.body)
}
}
這本身起作用。
我注意到的第一件事是當使用從「服務」獲取地圖到「小部件」時關鍵字「this」改變範圍,使得createlist()
變得未定義。但如果我只是做這個沒有綁定它的作品。
// I can test this with mocking the makeManagerRequest
makeRequest(data) {
this.makeManagerRequest.updateEmployee(body)
}
當使用地圖我需要.bind(this)
。不知道爲什麼「這個」改變?當我嘗試測試和模擬服務並監視服務時,會產生這個問題。我從來沒有被調用過間諜。所以我認爲在創建地圖時會發生什麼是綁定創建新功能。所以我不能窺探
spyOn(MockMakeManagerRequest, 'updateEmployee')
所以我想弄清楚函數本身如何存儲在Map()中。我正在尋找這個集合的技術含義,以及我如何能夠做到這一點,以便我可以實現這個測試。
這實際上是在Angular 2應用程序中使用。但我不認爲這會產生太大的差異,因爲我試圖在Map()中存儲值時測試/測試函數會發生什麼情況。
至少有關:http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback,http://stackoverflow.com/問題/ 3127429/how-do-this-keyword-work,可能我應該使用其中一個(可能是第二個)以重複投票的方式進行。 –
是的,真的,如果你看過'Map'方面,那是第二個方面的重複。但是我會在下面留下社區維基答案以防萬一。 –