[英]Will event be triggered before I set up the listener?
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);
該代碼不會產生任何結果,因為正如您所懷疑的,它會在設置偵聽器之前完成。
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,則不應使用setTimeout並將其鏈接。
var a = require('child_process').spawn('ls', ['-l']).stdout.on('data', function (data) {
console.log(data.toString());
});
瀏覽器如何通過反復運行代碼來神奇地確保這一點? 那么事件只有在本輪結束后才觸發嗎?
是。 或者至少應該如此,我不認為在所有瀏覽器和所有邊緣情況(例如緩存的文件)中都可以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
在輸出之前花費了超過一秒鍾的時間,然后您就可以捕獲它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.