2016-05-29 13 views
2

イベントとして関数を登録すると、その関数内のemitは呼び出されません。それ自身の関数が呼び出されます(ログによってテストされます)。これでメソッド2を使ってイベントを登録すると、それは機能します。どうしてこれなの?クラス内のイベントでNodeJS EventEmitterが呼び出されない

方法1(イベントを呼び出すことはありません):

方法2(作品):

"use strict"; 
const EventEmitter = require("events"); 

class DiscordBot extends EventEmitter{ 
    constructor(key){ 
    super(); 
    } 

    startBot(){ 
    var self = this; 
    this.bot.on("ready",function() { 
     self.botReady(); 
    }); 
    } 

    botReady(){ 
    var self = this; 
    self.emit("Bot_Ready"); 
    console.log("TESD"); 
    } 

} 

レジスタ:

bot.on("Bot_Ready", function(){ 
    console.log('this happens '); 
}); 
+1

このようなarrow機能を使用する必要がありますか?this.bot.on( "ready"、> this.botReady()); '? – yurzui

+1

最初の例では、self.botReadyをself.botReady()のように呼び出す必要がありますか? –

+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Lexical_this – yurzui

答えて

0

「たぶん、あなたは文脈を失い、あなたが必要このようなarrow関数を使用するにはthis.bot.on( "ready"、()=> this.botReady()); " - @yurzui

魅力的な作品です。

+1

いいえ、いいえ、いいえ。それは(働いていると思われる)ことは十分ではないということです。上記の私の記事のリンクを読んで、* WHY *のシナリオが機能するかどうか、そして他のシナリオは理解できないことを確認してください。また、[Cargo Cult Programming](https://en.wikipedia.org/wiki/Cargo_cult_programming)を読むことに興味があるかもしれません。最後に[Arrow Functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)と[this Closures](https:// www。 sitepoint.com/es6-arrow-functions-new-fat-concise-syntax-javascript/)。 – paulsm4

+0

PS:あなたの応答を編集してください:1)なぜ「方法1」が機能し、「方法2」がそうでないのか、2)(新しい、ES6)「矢印機能」が「方法2」と同じことを達成する方法を説明してください。私はupvoteにdownvoteを変更することを嬉しく思っています:)あなたが "何の背後にある"理由を詳述した後でも、*あなたの応答を受け入れることを自由に感じてください。 – paulsm4

1

これはclosureを作成:

this.bot.on("ready",function() { 
    self.botReady(); 
}); 

方法1ない:上記MDNリンクから

startBot(){ 
    var self = this; 
    this.bot.on("ready",self.botReady); 
    } 

クロージャがそのオブジェクトの特別な種類であります 関数と、その関数が作成された環境の2つの要素が組み合わされています。 環境は、クロージャが作成された時刻の にスコープ内にあったローカル変数で構成されています。ここで

説明するのに役立つかもしれない別の偉大なリンクです:あなたは別の 関数内functionキーワードを使用する場合は、JavaScriptで

How do JavaScript closures work?

注この部分クロージャを作成しています。

関連する問題