JavaScriptのPromiseのresolveを引数の関数外から呼ぶ方法を知りたいです。一応動作はさせられたんですが明らかにイレギュラーな使い方なので、もっと良い方法があれば知りたいです。
まず通常の例です。foo.bar()を呼び出すと、Promiseを返し、1000ms後に完了したいとします。
この例は動作します。
JavaScript
1class Foo{ 2 bar(){ 3 return new Promise((resolve)=>{ 4 setTimeout(()=>{ resolve() }, 1000 ); //1000msかかる処理があるとする 5 }); 6 } 7}
次に、動作しない例です。こういうことがしたい、というイメージです。
つまりnew Promise()に渡す無名関数に何でもつっこむのが嫌になった時に、後で別の関数からresolveを呼び出したいです。
なぜそう思ったかというと、その無名関数が巨大になったり、外から中断したい可能性のあるいくつかの非同期実行される関数を経て、最終的にresolveを呼びたい(または中断された場合には呼ばない)ということがしたかった、というのが理由です。
JavaScript
1class Foo{ 2 bar(){ 3 this.promise = new Promise((resolve)=>{}); //とりあえずpromiseを保持しておく 4 setTimeout(this.onTimeout.bind(this),1000); //1000msかかる処理があるとする 5 return this.promise; 6 } 7 onTimeout(){ 8 //処理完了 9 this.promise.resolve(); //そのようなメソッドは存在しないのでエラーです 10 } 11}
きれいではない方法ですが、動作をさせることができたサンプルです。
JavaScript
1class Foo{ 2 bar(){ 3 this.promise = new Promise((resolve)=>{ 4 this.resolveFunction = resolve; //resolveも保持しておく 5 }); //とりあえずpromiseを保持しておく 6 setTimeout(this.onTimeout.bind(this),1000); //1000msかかる処理があるとする 7 return this.promise; 8 } 9 onTimeout(){ 10 //処理完了 11 this.resoveFunction.call(promise); //一応できた 12 } 13}
どう見てもイレギュラーな方法なので、良い書き方があれば知りたいです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/01 20:58