2017-06-15 10 views
0

私はES6でいくつかのノードコードを書いています。私のコードでは、次のようなクラスがあります。これは、問題を切り分けて表示するための基本的な例です。JavaScript - チェーン付き約束で "this"を使用する

class MyClass { 
    constructor() { 
    this.id = uuid(); 
    this.number = Math.floor((Math.random() * 100) + 1); 
    } 

    process() { 
    this.validateNumber() 
     .then(this.generateImage) 
     .catch(function(err) { 
     console.log(err); 
     }) 
    ; 
    } 

    validateNumber() { 
    let self = this; 
    var promise = new Promise(function(resolve, reject) { 
     // do stuff with self.number 
     resolve({}); 
    }); 
    } 

    generateImage() { 
    console.log(this); 
    // the above prints "undefined" in the console window 
    // how do I get this.number again? 

    } 
} 

このクラスでは、コンストラクタで乱数を生成することに気付くでしょう。そのクラスのメソッド全体でその番号を使用できるようにしたい。しかし、私は連鎖が約束する一つの方法を持っているので、validateNumberが実行された後にはthisが意味を失うようです。

私はこれをどのように解決するのですか?

+0

内部のコンテキストを保持する必要がありますか? – Bergi

+0

いいえ、generateImageをインスタンスにバインドせずに 'then'に渡すと意味が失われます。 – Bergi

+0

@Bergi ...あなたは正しいです。今更新する。 – user70192

答えて

-1

ES6には、矢印機能という機能が導入されました。従来のfunction構文よりも簡潔な構文とは別に、この文脈を保持しています。基本的に、あなたのコードは次のように変更することができます:

var promise = new Promise((resolve, reject) => { 
     console.log(this); // MyClass 
     resolve({}); 
}); 

そして、あなたはまた、私はあなたが `.then(this.generateImage)`意味と仮定しthen

this.validateNumber() 
    .then(() => this.generateImage()); 
+0

私が提案した変更は私のために働いた – maddockst

+0

ああ、私は '()'を逃しました。 – maddockst

関連する問題