2016-06-11 10 views
0

私は基本的に一定の時間スリープし、 'ダウンロードされた'イベントを放つ偽のダウンローダを作成しようとしています。私はまた、私自身の変数を放出して放出されるイベントの数を追跡したいと思っています。コードの この作品は、次のエラーがスローされます:ES6クラスのコンストラクタがnodejsで動作しません4.4.5LTS

ReferenceError: this is not defined 

コード:

をthis.totalEmitted私がコメントする場合は、として、それが正常に動作します
'use strict'; 
const EventEmitter = require('events'); 

class Downloader extends EventEmitter{ 
    constructor(){ 
     this.totalEmitted = 0; 
    } 
    download(delaySecs){ 
     setTimeout(() => { 
      this.emit('downloaded',delaySecs); 
      this.totalEmitted ++; 
     },delaySecs*1000) 
    } 
} 

module.exports = Downloader; 

UPDATE:

私は完全にそれが正常に動作し始めたコンストラクタを排除します。

空のコンストラクタを使用しても、この参照エラーが発生しています。

コンストラクタがまだノード4.4.5でサポートされているかどうかはわかりません。

周りの仕事:

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

class Downloader extends EventEmitter{ 
    download(delaySecs){ 
     setTimeout(() => { 
      if(this.totalEmitted == undefined) this.totalEmitted = 0; 
      this.totalEmitted ++; 
      this.emit('downloaded',delaySecs,this.totalEmitted);    
     },delaySecs*1000) 
    } 
} 

module.exports = Downloader; 
+0

にあなたが必要な場合は、矢印の機能を使用しないでくださいは、それらの中の 'これ '。それを通常の関数 – vicodin

+1

@vicodinに書き直そうとすると、実際には矢印機能を使用しないと問題が発生します。 user3151330は外側の 'this'('ダウンロード 'の' this')を望んでいます。通常の関数をバインドするか、より高いスコープの値を使用して 'setTimeout'コールバックで' Downloader'インスタンスに到達させる必要があります。 –

+0

本当に、私の謝辞 – vicodin

答えて

0

それはそんなに機能にES6クラスからの切り替えお邪魔していない場合、あなたは試みることができる:

'use strict'; 
const util = require('util'); 
const EventEmitter = require('events'); 

function Downloader() { 
    var self = this; 

    self.totalEmitted = 0; 

    this.on('downloaded', function() { 
    self.totalEmitted ++; 
    console.log(self.totalEmitted); 
    }); 
} 

util.inherits(Downloader, EventEmitter); 

Downloader.prototype.download = function(delaySecs) { 
    setTimeout(() => { 
     this.emit('downloaded', delaySecs); 
    }, delaySecs*1000); 
}; 

var downloader = new Downloader(); 
downloader.download(1); 

module.exports = Downloader; 
関連する問題