2017-05-06 12 views
1

私はちょうど私のnode.jsアプリを書くためにjavascriptの代わりにtypescriptを使い始めています。私はちょっと混乱しています。クラスの静的変数がapp.listenのコールバックで定義されていません

私はstartSever()にPORT変数の値を取得することができ特急サーバー

import * as express from 'express'; 

class Server { 
    static expressApp: express.Express; 
    static PORT: number = 3000; 

    public static startServer():void { 
     this.expressApp = express(); 
     console.log(this.PORT); 
     this.expressApp.listen(this.PORT, this.serverStartedCallback) 
    } 

    private static serverStartedCallback():void { 
     console.log("Server is listening on port " + this.PORT); 
    } 
} 

Server.startServer(); 

を開始し、このコードを持っています。

しかし、コールバックserverStarted()this.PORT変数がundefinedです。 これはなぜか誰かが詳しく説明できますか?

+0

'this.constructor.serverStartedCallback' –

答えて

0

"this parameters in callbacks"セクションから:

あなたが後でそれらを呼ぶライブラリに 機能を渡すときにも、コールバックにthisとエラーに実行することができます。あなたのコールバックを呼び出すライブラリ は通常の関数のように呼び出すので、this は定義されません。

代わりthisを使用しての機能を渡すためにクラス名を使用するための最も些細な修正:

this.expressApp.listen(Server.PORT, Server.serverStartedCallback) 

注:非静的な環境では、この問題は簡単かもしれません矢印関数を使用して解決されます。

class Caller { 
    call(method:() => void) { method(); } 
} 

class Server { 
    caller: Caller = new Caller(); 
    PORT: number = 3000; 

    public startServer(): void { 
     this.caller.call(this.serverStartedCallback_Arrow); 
     this.caller.call(this.serverStartedCallback_NonArrow); 
    } 

    private serverStartedCallback_Arrow =() => { 
     console.log("Arrow Server is listening on port " + this.PORT); 
    } 

    private serverStartedCallback_NonArrow(): void { 
     console.log("Nonarrow Server is listening on port " + this.PORT); 
    } 
} 

var server = new Server(); 
server.startServer(); 

コンソール:

Arrow Server is listening on port 3000 
Nonarrow Server is listening on port undefined 
関連する問題