JavaScriptの非同期性の背後にあるもの - イベント駆動型システム
-
09-09-2020 - |
質問
これを理解してください。
いくつかの方法を呼び出す関数があります。
function() {
methodA(function(){...});
methodB();
methodC();
}
.
コールバックや匿名関数を持っていない言語から事実に慣れました。メソッドが戻るまで実行が続いていないこと。
それで、コールバックを使ってMethodaと呼ばれると、メソッドが非同期ではないものに戻るまで実行を待つ必要があります。
では、例えば、コールバックをいくつかのオブジェクトに保存し、Methoda Returnを持つことができます。その後、方法Bと方法Cが実行されます。また、ユーザーがボタンをクリックすると、一部のハンドラはコールバックを実行しますか?
JavaまたはPython(マルチスレッドに関するものではない)と比較してJavaScriptについて非同期は何もないと思います.... Javaではコールバックがクロージャ/匿名メソッドではなく、オブジェクト"メソッドとそれはまったく同じであるでしょう、ほんの少し複雑な...もちろんDOM
に固有のこのJSイベントシステムがあります。解決
JavaScriptのコールバックは暗黙的に非同期動作を追加しません。コールバック関数が呼び出されると、通常の関数としてがを実行します。 (実際には、コールバック関数はの通常関数だけです...)
これのため、例のコールバックの実行が他のメソッドに関係を実行するかどうかを判断するのは不可能です(methodA
が呼び出される前に実行できないことを除く) - - methodA
またはmethodB
から、または後でクリックした場合、またはまったく呼び出すこともできます。 (ただし、例外がある場合、または関数の1つが他の関数の1つを呼び出すと - methodA
の前にmethodB
が実行されます。これはmethodC
の前に実行されます。methodA
が例外をスローした場合は、methodB
もmethodC
も呼び出されません。 )
doE の追加非同期動作は、非同期イベントソースです。ボタンクリックなどのタイマーイベントやUIアクションなど、
しかしながら、JavaScriptがスレッドを持たない、またはサポートしていないことに留意することが重要です。新しい非同期イベントをトリガーできる前に、JavaScriptを「停止」(非同期イベントソースから呼び出されたコールバック関数から戻る必要があります)。 (非同期イベントは適切な場合はキューに入れられます。このようにタイマーイベントは、実行に時間がかかりすぎる場合は「失われません」になりません。)
while (true) {}
がブラウザページを凍結させ、ボタンイベントハンドラが処理されないようにする理由です。
幸せなコーディング。
例( jsfiddle demo ):
function invokeNow(callback) {
// nothing asynchronous going on here.
// the callback is invoked right now and the result is returned.
return callback()
}
alert(invokeNow(function () { return "Hello world!" }))
function doLater(callback) {
// setup an asynchronous event
setTimeout(callback, 1000)
return "It isn't 'later' yet!"
}
alert(doLater(function () {
alert("Later!")
// note that this is running in the callback from the previous
// timer event. if this code was below the outer alert then
// it wouldn't have allowed the first timer callback to have occurred
// until the blocking while was complete
alert(doLater(function () { alert("I still ran!") }))
var end = (+new Date) + 4000
while ((+new Date) < end) { /* wait */ }
alert("I am done waiting")
}))
.
警告:Firefox 4(4.0.1)と上記のコードに関する問題があるようです。それは実証されているように機能しますが、タイムアウトが約800ms以下の場合、予想される順序は実際の順序と異なります。 SO:非同期タイマーイベントが同期的に実行されている( "Buggy" )Firefox 4で?そうしたら、決議があることがあることがあります。この行動は、Firefox 3、つまり9、およびChrome 11で予想されるように機能します。
他のヒント
function main() {
methodA(function callback(){...});
methodB();
methodC();
}
Assuming that callback is not immediately executed.
Execution order:
- methodA
- methodB
- methodC
- ... other things until the stack is empty
- callback
Javascript is sequential except if you use setInterval
, setTimeout
, or make a request to a server with a callback or using onload
. Not sure there are other cases.
If you have something like:
function methodA(fn){
...
fn();
}
Then the callback will be called when you call methodA(function(){...})