使用typescript从回调内部调用方法

时间:2014-12-15 09:36:04

标签: node.js typescript

我在从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解决方案更可取。感谢

1 个答案:

答案 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并且被调用的方法将方法传递给另一个函数)。