我在从TypeScript中的同一个类中的另一个方法中调用方法时遇到问题。我想在routeTheRequest
方法中调用onRequest
方法,但我无法使其正常工作。
index.ts
import server = require("./server");
new server.MyServer();
server.ts
import http = require("http");
export class MyServer{
public constructor(){
http.createServer(this.onRequest).listen(8888);
console.log("Server has started.");
}
private onRequest(request: http.ServerRequest, response: http.ServerResponse){
var path = request.url;
this.routeTheRequest(path); // *** how do i call routeTheRequest ?? ***
response.writeHead(200, { "Content-Type": "text/plain" });
response.end();
}
private routeTheRequest(urlString: string): void{
console.log("user requested : " + urlString);
}
}
使用this.routeTheRequest
无法正常工作,this
会丢失范围并引用http.Server
正在返回的createServer
对象。我已经尝试过从这些页面调用this
的所有不同方式...
How can I preserve lexical scope in TypeScript with a callback function
TypeScript "this" scoping issue when called in jquery callback
非jQuery解决方案更可取。感谢
答案 0 :(得分:1)
您可以通过编写此类onRequest
方法来解决此问题。注意,你不应该写这样的所有方法,因为它会花费一些性能(它为每个实例创建一个新函数而不是把它放在原型上)但在这种情况下并不重要。
class MyServer {
private onRequest = (request: http.ServerRequest, response: http.ServerResponse) => {
var path = request.url;
this.routeTheRequest(path); // *** how do i call routeTheRequest ?? ***
response.writeHead(200, { "Content-Type": "text/plain" });
response.end();
}
}
注意函数上的lambda。
另一种方式是写作:
http.createServer(this.onRequest.bind(this)).listen(8888);
编辑:
我谈到它确实会降低成本,但影响并不大,但我实际上的意思是不要用这种方式编写每个方法(只需要捕获this
并且被调用的方法将方法传递给另一个函数)。