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