在设置监听器之前是否会触发事件?

时间:2013-03-10 11:02:39

标签: javascript node.js event-handling

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);

2 个答案:

答案 0 :(得分: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());
});

答案 1 :(得分: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在输出之前花费的时间超过一秒,然后你就会抓住它。