2016-04-13 13 views
1

非同期プロミスが解決された後、同期コードを実行する必要があります。現在、私のコードは次のようになります。Promiseハンドラの同期コード

console.log("Starting"); 

promiseFunc(). 
then(function() { 
    console.log("PromiseFunc done. Doing Synchronous work..."); 
    synchronousFunc1(); 
    synchronousFunc2(); 
    console.log("Synchronous work done"); 
}). 
catch(function(err) { 
    console.log("Error:" + err); 
}). 
then(function() { 
    console.log("Done") 
}); 

すべてが正常に動作している:最初のthenpromiseFuncが解決された後に実行され、最終thenが最後に実行されます。 私は仕様が新しいプロミスかthenからの価値を返すと思っていますが、私が返すことは何も役に立ちません。ここで

は私の質問です:

  1. は約束した後、同期コードを実行するためのこの「パターンは」メイクセンスを解決されていますか? thenブロックから未定義に戻すことはできますか?
  2. 誰かが約束してsynchronousFunc1を実装しようと決めたらどうなりますか?これは実行の順序を破ります。 私は、このような急変をしてはならないと思います。代わりに別のasynchronousFunc1を実装する必要があります。私は正しい?
  3. 私のcatch/then実装についてはどうですか?最終thenは常に実行する必要があります。 catchハンドラに例外がスローされた場合、これはうまくいかないと思います。代わりがありますか?私は青い鳥にfinallyハンドラがあることを知っていますが、私は標準のプロミス機能のみを使用したいと思います。

答えて

2

約束が解決された後に同期コードを実行するためのこの「パターン」は意味がありますか?

はい。それは私たち全員がやっていることです。

ブロックthenからundefinedを返信してもよろしいですか?

実際にはすべての作業に結果が必要です(それ以外の場合は無意味です)。returnです。しかし、あなたの関数が副作用だけを実行している場合は、undefinedを返しても問題ありません。

誰かが約束してsynchronousFunc1を実装することを決定したらどうなりますか?これは実行の順序を破ります。

はい、これは大きな変更です。

このような改訂は行わないでください。代わりに別のasynchronousFunc1を実装する必要があります。私は正しい?

改ざんの変更の処理方法は、ライブラリのポリシーと発信者との契約によって異なります。これはメジャーバージョンのアップデートかもしれないし、新しい機能かもしれないし、何かかもしれない。それはもちろん、適切に発表されるべきです。とにかくコードを変更する必要があります。

関数の名前が同期であることが示唆された場合、それは約束を返すべきではありません。その場合には実装の名前を変更する必要があります。

私のcatch/thenの実装についてはどうですか?最終thenは常に実行する必要があります。 catchハンドラに例外がスローされた場合、これはうまくいかないと思います。

正しい。 catchハンドラがスローしないようにする必要があります:

他にもある方法がありますか?私は青い鳥にfinallyハンドラがあることを知っていますが、私は標準のプロミス機能のみを使用したいと思います。

ブルーバードを使用している場合は、finallyを使用してください。とにかく標準化される可能性が高く、他の多くのライブラリも同様にそれをサポートします。そうでない場合は、いつでもshim it yourselfにすることができます。その実装はあなたのものよりも優れています。特に、戻り値や取り消しなどの処理については適切です。

+0

偉大な答え。ありがとうございました! – krombi

関連する問題