2009-12-13 5 views
2

아주 간단한 질문 : 나는

doSomething(); 

$.get(url, callback); 

doSomethingElse(); 

내가 GET 요청을 보낸 직후 doSomethingElse()가 실행되는 시작 것을 이해 다음 JS/jQuery 코드가 있다고 가정합니다. 이제 doSomethingElse()가 실행되는 동안 서버의 응답이 도착한다고 가정합니다. 무슨 일이야?

  • doSomethingElse()와 병렬로 별도의 스레드에서 콜백이 실행됩니까?
  • doSomethingElse() 실행은 콜백이 실행될 때까지 일시 중지됩니까?
  • doSomethingElse()가 반환 된 후에 만 ​​콜백이 호출됩니까?

통찰력을 가져 주셔서 감사합니다.

라라는 콜백 뭔가에 의존

답변

6

아니요, 웹 브라우저의 JavaScript는 디자인 상 단일 스레드입니다. 즉, ajax 호출이 즉시 시작될 수 있지만 (브라우저의 다른 스레드에서 처리 될 수도 있음) JavaScript 인터프리터가 다음에 유휴 상태가 될 때까지 콜백이 수행되지 않습니다. 할 일은 통역사가 유휴 상태가되어 처리 할 때까지 기다리는 것입니다.

편집 응답 특정 질문 :

doSomethingElse에 병렬로 별도의 스레드에서 콜백 실행()를합니까?

아니요, 아니요, 콜백은 doSomethingElse과 같은 논리 스레드에서 실행됩니다. (그것은 구현에 의존 그 같은 실제 기본 OS 스레드가 있는지 여부가 될 것입니다,하지만 당신은 알 방법이 없습니다 당신은 상관하지 않습니다 논리적으로을, 같은 스레드입니다.)

가의 실행을합니까 doSomethingElse()는 콜백이 실행될 때까지 일시 중지합니까?

기본적으로 get은 비동기식입니다. doSomethingElse은 요청을 시작하지만 계속됩니다. (동기화 기본 XmlHttpRequest 메커니즘을 통해 얻을 수 있지만 아주 나쁜 생각이야 - 요청이 실행되는 동안 브라우저의 UI를 완전히 잠그는 경향이 있습니다. 이것은 추한 것입니다. jQuery로 어떻게하는지 알 수 있습니다.)

doSomethingElse()가 반환 된 후에 만 ​​콜백이 호출됩니까? 비동기 get (보통의 종류)와

, 당신은 예, 콜백이 호출되기 전에 doSomethingElse 완료 것이라고 확신 할 수 있습니다. 이것은 JavaScript 인터프리터가 한 번에 한 가지만 수행하고 현재 작업이 완료 될 때까지 새로운 작업을 수행하지 않기 때문입니다. 따라서 doSomethingElse이 get을 트리거하지만 (get은 자바 스크립트와 병행하여 다른 비 JavaScript 스레드에 의해 처리 될 수 있음) 인터프리터가 doSomethingElse 및 그 외의 호출로 완료 될 때까지 콜백이 발생하지 않습니다.

어떤 시점에서 브라우저 기반 JavaScript에서 여러 스레드가 시작되면 놀랄 일이 아니지만, 우리가 할 경우, 우리 모두가 그 순간에 행복하게 하나의 스레드를 가정하기 때문에 명시 적이어야합니다. .

-2

솔직히 답을 알고하지 않습니다,하지만 난 doSomethingElse에 코드를 놓지 것()()한다. doSomethingElse()가 항상 먼저 실행되지만 타이밍/스레드 문제에 대해서는 확실하지 않습니다.

1

아니요, 자바 스크립트에는 단 하나의 제어 스레드 만 있습니다. 현재 실행중인 함수는 완료 될 때까지 계속 실행되고 준비가되면 콜백이 호출됩니다.

질문에 구체적으로 대답하기 위해 doSomethingElse()가 반환되면 콜백 만 호출됩니다. 물론 GET 요청이 성공적이라고 가정합니다. 오류가 발생하면 콜백이 실행되지 않습니다.

2

모든 의도와 목적에는 JS에 스레드가 없으므로 별도의 스레드에서 실행되지 않습니다.

비동기 콜백을 사용하는 웹 API는 다음과 같습니다. get()이 즉시 반환되고로드가 완료되고 다른 JS 코드가 실행되지 않으면 콜백 함수가 호출됩니다.

+0

olliej는하지만, "실행중인 다른 JS 코드가 없다"는 무엇을 의미 하는가? 다음 진술이 완료된 후에도 의미가 있습니까? .get() 함수를 실행 한 함수가 반환 한 후에? 또는 내 페이지의 모든 JS 코드가 실행될 때까지? – laramichaels

+0

그가 의미하는 바는 JavaScript 코드가 실행 중이면 콜백에서 다른 JavaScript 코드에 의해 인터럽트되지 않는다는 것입니다. 예를 들어, 코드가 .ready() 이벤트를 실행하는 중간에 있다면 콜백이 실행되기 전에 ready 이벤트의 코드가 완료되어야합니다. –

+0

명확히 해 주셔서 감사합니다! – laramichaels

0

다음은 어떻게 작동하는지 보여주는 꽤 좋은 기사입니다.

http://www.javascriptkata.com/2007/06/12/ajax-javascript-and-threads-the-final-truth/

+0

링크 주셔서 감사합니다. 그러나 그것을 읽은 후에도 콜백이 언제 실행되는지 정의하는 것을 이해하지 못합니다. 현재 함수가 반환 된 후입니까? 페이지의 모든 JS 코드가 실행 되었습니까? 현재 JS 문이 실행 된 후 ...? 어떤 통찰력을 주셔서 감사합니다 – laramichaels

+0

get 요청이 완료되면 콜백이 호출됩니다. 따라서, $ .get()은 비동기 XMLHttpRequest를 제공하는 스크립트 경로로 만듭니다. 요청 객체가 서버로부터 응답을 받으면 제공된 콜백을 실행합니다. –

관련 문제