2012-11-14 4 views
1

나는 혼란 스럽다. 이 코드의 경우 :Jquery에서 비동기 호출로 구성된 동기 함수의 실행을 지연하는 방법은 무엇입니까?

function prepareit(list){ 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
     $.ajax({....}); 
    } 
} 

function testit(list){ 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
     $.ajax({....}); 
    } 
} 

$(document).ready(function() { 
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i']; 
    prepareit(list); 
    testit(list); 
}); 

"준비"가 완료되면 함수 "testit"을 실행해야합니다. 나는 "when-then"방법으로 이미 시도했지만 기능은 동시에 시작됩니다.

답변

1

모든 ajax 요청이 완료 될 때 해결되는 지연된 개체를 만듭니다.

function prepareit(list){ 
    var defArr = []; 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
     defArr.push($.ajax({....})); 
    } 
    return $.when.apply($,defArr); 
} 

function testit(list){ 
    var defArr = []; 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
      defArr.push($.ajax({....})); 
    } 
    return $.when.apply($,defArr); 
} 

$(document).ready(function() { 
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i']; 
    prepareit(list).done(function(){ 
     testit(list).done(function(){ 
      alert("All done!"); 
     }); 
    }); 
}); 
+0

감사합니다. Kevin B, 코드가 완벽하게 작동합니다. –

+0

@ user1824310 도움이 되었으면 대답 옆에있는 녹색 체크 표시를 클릭하여 답변을 수락했음을 표시하십시오! – Mansfield

0

당신은과 같이, prepareit에서 아약스 요청의 성공 기능에 testit를 호출 할 수

(내 나쁜 영어 죄송합니다) : 당신이 의존하는 경우

function prepareit(list){ 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
     $.ajax({ success: function (data) { testit(list); } }); 
    } 
} 

function testit(list){ 
    for(i=0;i<list.length;i++){ 
     var test = list[i]; 
     $.ajax({....}); 
    } 
} 

$(document).ready(function() { 
    var list = ['ti','meti','medes','fra','u','w','ro','sit','hd','i']; 
    prepareit(list); 
    //testit(list); 
}); 

이 작동하지 않습니다 전체 목록에서 "테스트"전에 "준비"되어 있어야합니다. 반복하는 아약스 요청이 최선의 방법이 아니라고 말하고 싶습니다. 가능한 경우 여러 번 반복하지 않고 (아약스 호출에서 전체 목록을 전달하도록 코드를 변경해야합니다. 코스).

+0

"prepareit"의 모든 호출이 끝난 후에 "testit"을 실행해야하므로이 경우에는 유효하지 않은 것 같습니다. 코드에서 "prepareit"을 반복하면 "testit"의 모든 코드가 실행됩니다. –

+0

@ user1824310 예, 정확히 말하면 편집에서 언급 한 것과 같습니다. 목록의 각 항목에 대해 별도의 아약스 호출을해야하는 이유가 있습니까? – Mansfield

관련 문제