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

글쎄, load 이벤트가 더 일찍 트리거되지 않는다고 생각합니다.리스너를 설정하기 전에 이벤트가 트리거됩니까?

브라우저는 마술처럼 라운드별로 코드를 실행하여 어떻게 보장합니까? 따라서 이벤트는 현재 라운드가 끝난 후에 만 ​​트리거됩니까?

는 아래의 코드를 출력하지 아무것도, 우리가 또 다른 라운드foo 실행을하기 때문에 setTimeout를 사용하여입니까?

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

setTimeout(function foo() { 
    a.stdout.on('data', function (data) { 
    console.log(data.toString()); 
    }); 
}, 1000); 
+1

이 서버 측 코드 또는 클라이언트 측 코드입니까? 서버 측이라면 (ls -l 때문에 추측하고있다.) 브라우저는 마술처럼 아무것도 보장하지 않는다. – jnovack

+0

@JNovack 자바 스크립트가 이벤트를 다루는 방법은 '노드'에서'v8 '을 사용하므로 클라이언트와 서버 같은 생각을 공유합니다. – lostyzd

답변

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 

아래의 코드 출력하지 아무것도, 우리가 foo는 다른에서 실행하기 때문에의 setTimeout을 사용하는 것입니다 일주?

정확히. 물론 서버가 느리고 ls -l이 출력하기 전에 1 초 이상 걸리는 상황이 발생했을 가능성이 있습니다 (그럴 수 있습니다).

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()); 
}); 
관련 문제