0

次のコードは 0 または 2 しか出力しないと思っていましたが、Firefox 24 では 1 を出力することがあります。これは (将来の) 標準に準拠していますか? タイムアウトイベントが同期呼び出しによってブロックされると、Firefoxはイベントを切り替えると思います。Chrome 30.0.1599.69 m では再現できませんでした (Web サイトを開いた状態でコンソールにこのコードを入力しました)。

var z=0;
var x = new XMLHttpRequest();
x.onload=function(){
 console.log(z);
};
x.open('GET','.',true);//asynchronous call
x.send();
setTimeout(function(){
 var i=1e7;
 while(i--);//some time to waste while the asynchronous call finishes.
 var y = new XMLHttpRequest();
 y.open('GET','.',false);//synchronous call
 z=1;
 y.send();
 z=2;
},10);

この問題を示す短いコードを知っている人はいますか?

4

1 に答える 1

0

y.send()「同期」であるとイベントループがスピンしますが、スピン中にそのDOMウィンドウ/ドキュメントのイベントも遅延する必要があります...

したがって、これは XHR 実装/イベント ディスパッチャのバグか、実装の「バグ」のいずれかのようですconsole(実際には、複数のドキュメント間で多少非同期です)。

とにかく、同期 XHR を避けるもう 1 つの理由は、面白い再入動作です。これを再現できる場合は、バグを報告する必要があるようです(私はできませんでした)。

于 2013-10-21T11:29:20.487 に答える