2012-05-01 4 views
3

Javascript가 단일 스레드 언어라는 사실을 감안할 때 ExtJs의 다음 코드에서 실행 순서는 어떻게됩니까?ExtJs : ajax 호출에서 코드 실행 순서는 어떻게됩니까?

FuncA(); 

Ext.Ajax.request({ 
    url: 'ajax.php', 
    params: { 
     id: 1 
    }, 
    success: function(response){ 

     FuncB(); 
    } 
}); 

FuncC(); 

FuncD(); 

여기서, 함수의 실행 순서는 A-C-D-B?

또는

FuncB()가 이전에 FuncC() 또는 FuncD()에 호출되는 것을 이제까지 수 있습니까? 그렇다면 조건은 무엇입니까?

미리 도움을 청하십시오.

답변

2

아약스 요청이 동기식이 아니면 주문은 항상 A-C-D-B가되지만 UI가 정지하게되므로 실제로 사용하지 않는 것이 좋습니다.

예를 들어, 시도이 (바람직하게는 크롬에서) 당신이 코드를 실행하기 위해 1 초를 주위에 소요에도 불구하고, 아약스 요청이 항상 마지막에 발사 것을 볼 수

function f1() { 
    var s = ''; 
    for (var i = 0; i < 10000000; ++i) { 
     s += 'a'; 
    } 
} 

function f2() { 
    var s = ''; 
    for (var i = 0; i < 10000000; ++i) { 
     s += 'b'; 
    } 
} 

Ext.require('Ext.Ajax'); 

Ext.onReady(function() { 

    var d; 
    Ext.Ajax.request({ 
     url: 'data.json', 
     success: function(){ 
      console.log('finished'); 
     } 
    }); 

    d = new Date(); 
    f1(); 
    console.log(new Date() - d, 'f1 done'); 
    d = new Date(); 
    f2(); 
    console.log(new Date() - d, 'f2 done'); 

}); 

, 비록 요청 자체 만 약 7ms가 소요됩니다 (로컬 상자). 그런 다음 f1/f2에 대한 호출을 주석 처리하여 다시 시도하십시오.

+0

C 함수가 오래 걸리면 어떻게 될까요? Ajax 호출에 약간의 시간이 걸리면 어떻게 될까요? – sha

+0

그건 중요하지 않습니다. C & D 방법은 항상 동 기적으로 실행되므로 Ajax 요청을 완료 할 때까지 "잠금"을 해제하지는 않지만 적어도 일부 지연은 Ajax 요청을 만드는 데 있습니다. –

+0

즉, B는 새로운 호출 스택에 놓이고 C와 D는 A와 같은 스택에 있습니다. 각 스택은 항상 다음 호출이 시작되기 전에 완전히 처리됩니다. – user123444555621

0

{B} C {B} D {B}
B는 {B}로 표시된 모든 위치에서 실행할 수있다. 단 한 번만 실행됩니다.
편집 : -
아니요 자바 스크립트는 다중 스레드 언어가 아닙니다. 실행될 코드의 queue을 유지합니다. 그 다음 II 복귀 후에는 FuncC 및 실행을 시작 funcC 도달 그래서 다음 함수 (Ajax 요청이 완료되면) funcB 그래서 funcB 단지 두 함수 사이에서 실행될 수 수도 대기열에서 실행될 찾는다

+0

포스트 감사합니다. Parv. 그렇다면 Ajax 요청 완료에 따라 모두 달라질 수 있습니까? 그리고 이것이 사실이라면 실행은 갑자기 ajax 함수의 성공으로 넘어 가서 FuncB() 실행을 시작합니다. 아약스가 완성 되 자마자? – netemp

+0

내 ans를 편집했습니다 –

+0

전혀 동의하지 않아 샘플 코드를 내 대답으로 실행하십시오. –

-1
호출

자바 스크립트 코드는 위에서 아래로 실행됩니다. 따라서이 경우 코드 실행은 funcA()에서 시작하여 funcD()으로 끝나지만 funcB()으로 끝나는 것은 언제든지 ajax.php이 응답을 얼마나 빨리 반환 하느냐에 달려 있기 때문에 언제든지 호출 할 수 있습니다.

+0

B()는 항상 마지막으로 만 실행되며 어떤 경우에도 C() 또는 D() 전에는 실행되지 않습니다. 시간 내 주셔서 감사합니다. – netemp

+0

@netemp : 네, 맞습니다. – codef0rmer