4

JSのPromiseを使用すると、次のように非同期プログラミングを実行できます。

DoSomething().then(success, failure);

DoSomethingElse();

前のコードを書くときはいつでも、到達DoSomethingElse()する前に到達しsuccessます。そんなことがあるものか?JSはシングルスレッド環境(Webワーカーを除く)ではありませんか?それはで行われsetTimeoutますか?

4

2 に答える 2

5

はい、JavaScriptはシングルスレッドです。つまり、このシングルスレッドをブロックしないでください。長時間実行される待機中の操作(通常はAJAX呼び出しまたはスリープ/一時停止)は、コールバックを使用して実装されます。

ここで実装を見ずに、何が起こるかです:

  1. DoSomethingが呼び出され、引数として受け取りsuccessfailure機能します。

  2. 必要なことを実行し(おそらく長時間実行されるAJAX呼び出しを開始します)、戻ります

  3. DoSomethingElse()と呼ばれる

  4. ..。

  5. しばらくして、AJAX応答が到着します。以前に定義さsuccessれたfailure関数を呼び出します

(同様の問題)も参照してください

于 2012-03-18T11:58:58.893 に答える
0

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関数をチェーンしてロジックを実行します。

于 2012-03-18T12:32:07.700 に答える