2017-01-08 2 views
1

$.get 메소드를 통해 일부 데이터를로드 중입니다. 나는 get 호출에서 성공 함수를 사용했다. 하지만 when/then 구조를 사용하고 있습니다.jQuery 지연 객체에서 "then"및 "success"를 호출하는 순서

두 콜백이 모두 호출 되나요? 그렇다면 무엇이 먼저 발생하며 그 이유는 무엇입니까?

$.when(
    $.get("test.html", functionA) 
).then(functionB); 

성공하면,이 후, functionAfunctionB 전화를 보장? 아니면 B가 A 앞에 나오거나 functionA에있는 무엇인가가 functionB이 호출되는 것을 막을 수있는 상황이 있습니까? jQuery 문서에서 대답을 찾을 수 없습니다.

+0

@RoryMcCrossan 감사합니다. 흥미 롭습니다. "동시에 실행하십시오"- 다른 스레드에서 호출 될 것이라고 말하고 있습니까? 대부분의 JS가 순차적으로 실행되는 것처럼 보이기 때문에 놀랍습니다.하지만 오늘의 브라우저에서 가능한 모든 것이 있다고 가정합니다! –

+0

죄송합니다. 잘못된 것입니다. 순서대로 실행됩니다. https://jsfiddle.net/wm1t4zrh/ –

+0

여기에서 정답은 두 가지를 모두 사용하지 않는 것입니다. 하나의 기법이나 다른 기법을 선택하십시오. 내 강한 선호는 다른 방법으로 훨씬 더 유능하기 때문에 약속입니다. – jfriend00

답변

3

요약 :functionA은 예에서 functionB보다 먼저 호출됩니다. jQuery.ajaxsuccesserror 콜백 (예 : $.get)은 나중에 jqxhr 개체에 연결된 콜백보다 먼저 호출됩니다. 음, 오늘 :-)

상세 사항 : jQuery.ajax() 문서는이 문제를 언급하지 않습니다. 가능하다면 그것에 의존하지 않는 것이 좋습니다.

특정 jQuery 버전으로 개발하는 한 구현을 검사하여 변경되지 않는다고 가정 할 수 있습니다. 업그레이드하는 경우 가정이 유효한지 확인해야합니다. 예를 들어

, jQuery를 지원되는 모든 지점 (1.12.4, 2.2.4 및 3.1.1) 호출자가 jqxhr 객체를 가져 와서 등록 할 수 있습니다 전에 jQuery.ajax 설정 에서 successerror 콜백을 등록의 최신 릴리스 그들의 콜백. jqxhr 오브젝트는 Deferred Object으로, 해상도 또는 거부에 첨부 된 핸들러는 첨부 순서대로 실행됩니다. 예를 들어 deferred.done()의 설명서에서 확인할 수 있습니다. 즉, successerror의 jQuery.ajax 설정 콜백은 나중에 반환 된 jqxhr 개체에 첨부 된 콜백보다 항상 먼저 호출됩니다.

jQuery.ajax 3.1.1 sources를 참조하십시오

// Install callbacks on deferreds 
completeDeferred.add(s.complete); 
jqXHR.done(s.success); 
jqXHR.fail(s.error); 

내가 실행 순서를 변경하면 미래 jQuery를 업데이트 오히려 가능성이 있음을 인정. 그것이 내가 생각하기에, 그것에 따라 꽤 안정적 일 것이라고 생각하는 이유입니다.

+2

감사합니다. 훌륭한 답변입니다! 지금 당장은 안정적 일 수 있다고 생각합니다. –