1
var a = new Image();
...
// Is it possible that `load` happens here, so I won't be able to catch it?
...
a.onload = function () {};

loadまあ、イベントはもっと早くトリガーされないと思います。

ブラウザーは、コードをラウンドごとに実行することによって、魔法のようにそれをどのように保証するのでしょうか? では、イベントは現在のラウンドが終了した後にのみトリガーされますか?

以下のコードでは何も出力されsetTimeoutませfoo

var a = require('child_process').spawn('ls', ['-l']);

setTimeout(function foo() {
  a.stdout.on('data', function (data) {
    console.log(data.toString());
  });
}, 1000);
4

2 に答える 2

1

ブラウザは、コードをラウンドごとに実行することで、魔法のようにそれをどのように保証しますか?では、イベントは現在のラウンドが終了した後にのみトリガーされますか?

はい。または、少なくともそうすべきですが、すべてのブラウザとすべてのエッジケース(キャッシュされたファイルなど)で100%保証されているとは思いません。したがってsrc、リスナーを設定した後は常に(プロパティを割り当てて)ロードを開始する必要があります。

var a = new Image();
// Is it possible that `load` happens here? No.
a.onload = function () {};
a.src = "";
// Is it possible that `load` happens here? Yes

以下のコードは何も出力しません。setTimeoutを使用してfooを別のラウンドで実行するためですか?

その通り。もちろん、どういうわけか(ありそうもないことですが)サーバーが遅く、ls -l出力までに1秒以上かかることがあります。そうすれば、それを捕まえることができます。

于 2013-03-10T11:25:15.037 に答える
1

ご想像のとおり、リスナーをセットアップする前に完了するため、コードは何も生成しません。

Time   Event
00.000 Spawn Child process 12345 `ls` with arguments `-l`  (a)
00.001 Set Timeout for function foo() in 1 second.
00.011 child process 12345 terminated with data. (a)
01.001 Running foo()
01.002 Attach 'data' event to `a`

基本的に、バスに乗り遅れました(シリアルバスと考えると文字通り)

キャッチしたい場合は、 setTimeout を使用してチェーンしないでください。

var a = require('child_process').spawn('ls', ['-l']).stdout.on('data', function (data) {
  console.log(data.toString());
});
于 2013-03-10T11:21:26.267 に答える