JSのPromiseを使用すると、次のように非同期プログラミングを実行できます。
DoSomething().then(success, failure);
DoSomethingElse();
前のコードを書くときはいつでも、到達DoSomethingElse()
する前に到達しsuccess
ます。そんなことがあるものか?JSはシングルスレッド環境(Webワーカーを除く)ではありませんか?それはで行われsetTimeout
ますか?
JSのPromiseを使用すると、次のように非同期プログラミングを実行できます。
DoSomething().then(success, failure);
DoSomethingElse();
前のコードを書くときはいつでも、到達DoSomethingElse()
する前に到達しsuccess
ます。そんなことがあるものか?JSはシングルスレッド環境(Webワーカーを除く)ではありませんか?それはで行われsetTimeout
ますか?
はい、JavaScriptはシングルスレッドです。つまり、このシングルスレッドをブロックしないでください。長時間実行される待機中の操作(通常はAJAX呼び出しまたはスリープ/一時停止)は、コールバックを使用して実装されます。
ここで実装を見ずに、何が起こるかです:
DoSomething
が呼び出され、引数として受け取りsuccess
、failure
機能します。
必要なことを実行し(おそらく長時間実行されるAJAX呼び出しを開始します)、戻ります
DoSomethingElse()
と呼ばれる
..。
しばらくして、AJAX応答が到着します。以前に定義さsuccess
れたfailure
関数を呼び出します
JavaScriptのPromisesには通常、ある種の呼び出しチェーンまたは流暢なメソッド呼び出しAPIが含まれます。関数の結果は通常、with、then、when、whenAllなどの継続メソッドに加えて、結果が実際に利用可能かどうかを示すいくつかのステータスフラグを提供します。入力パラメーターを持つ関数は、入力がpromiseであることを検出し、promise値の準備ができたときにチェーンできるサンクに機能をカプセル化するpromised値をサポートすることもできます。
これらを使用すると、promiseが次のような並列言語をシミュレートする環境を提供できます。
MyApi.LongRunningTask()。then(function(result){MyAppi.LongOtherTask(result);})。then
または、長時間実行される呼び出しが依存しない順次ユースケース:
var value1 = MyApi.LongRunningTask();
var value2 = MyApi.LongRunningOtherTask();
MyApi.DoSomeFunction(value1、value2).then ==> DoSomeFunctionは、値の準備ができているかどうかを確認し、準備ができていない場合は、then/when関数をチェーンしてロジックを実行します。