次のプロパティを持つ JavaScript でコンストラクターを作成しています。
function WhizBang() {
var promise;
this.publicMethod_One = function publicMethod_One() { ... };
this.publicMethod_Two = function publicMethod_Two() { ... };
promise = asyncInit();
}
したがって、呼び出すとプロセスnew WhizBang()
が開始されasyncInit()
ます。上記のコードから明らかでないことは、この呼び出しが終了するまで、インターフェース内のパブリック メソッドはどれも実行されるべきではないということasyncInit()
です。
したがって、 の定義は次のpublicMethod_One()
ようになります。
function publicMethod_One() {
promise
.then( doStuff )
.catch( reportInitFailure )
;
function doStuff() { ... }
function reportInitFailure() { ... }
}
で発生することのいくつかdoStuff()
は非同期です。それらのいくつかはそうではありません。
したがって、私のクラスのエンドユーザーが次のようなことをしたとします。
function main() {
var whizBang = new WhizBang();
whizBang
.publicMethod_One()
.publicMethod_Two()
;
}
への呼び出しは、 が終了publicMethod_One()
するまで行ってはなりませんasyncInit()
。また、 と のpublicMethod_Two()
両方が閉じられるまで呼び出しを行ってはasyncInit()
なりませんpublicMethod_One()
。
クラスメソッドを連鎖可能に定義するにはどうすればよいですか?
私がする必要があると思うのは、パブリック メソッドがすべてthen()
promise の呼び出しと同等であり、その後にクラス固有の実装要素が続くクラスを定義することです。
インターネット、ハーフ!
(回答でBluebird Promise Libraryを使用するとボーナス ポイントが得られます。)