簡體   English   中英

在設置偵聽器之前會觸發事件嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM