2017-06-10 8 views
0

AJAXローダーをカプセル化しようとしています。ES6クラスを使用したAJAXのカプセル化

コードは次のようである:

ModelLoader.loadCsvFile('model1.csv', callback1); 
ModelLoader.loadCsvFile('model2.csv', callback2); 

this.callbackは最初_loadCsvFile(data)callback2なるので、それらの両方がcallback2になります:

const $ = require('jquery'); 

class ModelLoader { 
    static loadCsvFile(path, callback, options) { 
     this.callback = callback; 
     $.get(path, this._loadCsvFile); 
    } 

    static _loadCsvFile(data) { 
     ModelLoader.callback(); // using this.callback() doesn't work because this here is AJAX object 
    } 
} 

module.exports = ModelLoader; 

問題は、ユーザーがこのようなコードを書くときということですが呼び出されます。

AJAXをカプセル化するための洗練されたソリューションはありますか?

+0

'ModelLoader.callback'以外に' _loadCsvFile_'の中に何か他に何かありますか? – RyanNHG

+0

'$ .get(path、callback)'の中にコールバックを渡して、どこにも格納しないのはなぜですか? – Bergi

+0

静的メンバーだけで 'class'esを書いてはいけません。本当にそのようなオブジェクトが必要な場合は、オブジェクトリテラルを使用してください。 – Bergi

答えて

0

クラスでコールバックを維持する理由は何ですか? _loadCsvFileで 、私は、コールバックを渡し、そこにそれを呼び出す、次のようになります。それは、静的することはできませんので、あなたが内部thisを呼んでいるので、

class ModelLoader { 
    loadCsvFile(path, callback, options) { 
     $.get(path, (data) => { 
      this._loadCsvFile(data, callback); 
     }); 
    } 

    _loadCsvFile(data, callback) { 
     callback(); // using this.callback() doesn't work because this here is AJAX object 
    } 
} 

(私はloadCsvFilestaticキーワードを処分したことに注意してくださいその機能)。

+0

私はそれをテストしました。両方のメソッドが静的であればうまく動作します。 –

+0

あなたのコメントは正確ではなく、 'this.callback'はインスタンスに格納されていれば完全に動作します – Bergi

+0

しかし、それはクラスが静的ではないことを意味します。すなわち、各コールバックに対して、' ModelLoader 'オブジェクト。 – Catalyst

関連する問題