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我们使用 make foorun on another round吗?

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

该代码不会产生任何东西,因为正如您所怀疑的,它在您设置侦听器之前完成。

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 回答
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在输出之前需要超过一秒钟的时间,然后您就会抓住它。

于 2013-03-10T11:25:15.037 回答