Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在设置侦听器之前是否会触发事件?_Javascript_Node.js_Event Handling - Fatal编程技术网

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

Javascript 在设置侦听器之前是否会触发事件?,javascript,node.js,event-handling,Javascript,Node.js,Event Handling,嗯,我想加载事件不会提前触发 浏览器如何通过一轮一轮地运行代码神奇地确保这一点?那么事件只有在本轮结束后才会触发 下面的代码不会输出任何内容,是不是因为使用setTimeout我们使foo在下一轮运行 var a = new Image(); ... // Is it possible that `load` happens here, so I won't be able to catch it? ... a.onload = function () {}; 代码不会产生任何结果,因为正如您

嗯,我想加载事件不会提前触发

浏览器如何通过一轮一轮地运行代码神奇地确保这一点?那么事件只有在本轮结束后才会触发

下面的代码不会输出任何内容,是不是因为使用
setTimeout
我们使
foo
下一轮运行

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

代码不会产生任何结果,因为正如您所怀疑的,它在您设置侦听器之前就完成了

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

setTimeout(function foo() {
  a.stdout.on('data', function (data) {
    console.log(data.toString());
  });
}, 1000);
基本上,您错过了总线(如果您将其视为串行总线,则按字面意思)

如果希望setTimeout捕捉到它,则不应使用setTimeout并将其链接

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`
浏览器如何通过一轮一轮地运行代码神奇地确保这一点?那么事件只有在本轮结束后才会触发

对。或者至少应该,我不认为在所有浏览器和所有边缘情况下(例如缓存文件)都能100%保证。因此,您应该在设置侦听器之后开始加载(通过分配
src
属性):

var a = require('child_process').spawn('ls', ['-l']).stdout.on('data', function (data) {
  console.log(data.toString());
});
下面的代码不会输出任何东西,是不是因为使用setTimeout我们让foo在另一轮上运行


没错。当然,您的服务器可能(不太可能)运行缓慢,并且
ls-l
在输出之前需要一秒钟以上的时间,然后您就会捕获它。

这是服务器端代码还是客户端代码?如果是服务器端(我猜是因为
ls-l
,浏览器神奇地什么也不能保证。@JNovack它是关于javascript如何处理事件的,因为
node
使用
v8
,我想客户端和服务器都有相同的想法。
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`