2014-04-02 3 views
0
function hello() { 
    var arr = []; 
    $.get(url, function (data) { 
     var items = $(data).find("item"); 
     $(items).each(function (idx, item) { 
     arr.push(item); 
     }); 
    }); 
    return arr; //undefined because nested loops are not finished processing. 
} 

반환하기 전에 arr이 채워 졌는지 어떻게 확인합니까?중첩 된 비동기 함수가 완료되면 무언가 수행

+2

왜 downvote? – GoodSp33d

답변

1

비동기 호출에서 벗어날 방법이 없습니다. GET 호출 결과를 얻으려면 콜백이 필요합니다.

function asynCall() { 
    var response; 
    // Ajax call will update response here later. 
    return response; 
} 
var responseFromFun = asyncCall(); // This will be undefined or null. 

코드가 작동하는 방식입니다. 따라서 응답은 항상 undefined 또는 null이됩니다.

Ajax의 응답을 얻으려면 함수에 응답을 할당하는 대신 호출 할 때 함수에 콜백을 전달해야합니다.

function asyncCall(callBack) { 
    var response; 
    $.get(...) { 
     response = someValueReturnedFromServer; 
     callBack(response); 
    } 
    // There wont be a return here 
} 
asyncCall(function(response){ 
    // Do something with response now 
}); 

여기 단점은 다른 기능 (코드에) arr 객체를 전달하는 경우에도 그 콜백을 사용하도록 변경되어야한다는 것입니다!

+0

안녕하세요. 이 문제가 발생할 때까지 콜백이 어떻게 구성되었는지 실제로 알지 못했습니다. 이제 나! 추가 할 질문이 하나 더 있습니다. 콜백이 콜백과 관련된 다른 게시물에서 볼 수있는'typeof callback == 'function''과 같은 함수인지 확인해야하는 이유는 무엇입니까? –

+1

@ MaximusS 함수가 실제로 전달되었는지, 숫자가 아닌지를 확인하기 위해서입니다. 위 코드에서'asyncCall ("hello")'도 유효하지만 오류 처리가 수행되지 않았으므로'get' 호출이 완료되면 오류가 발생합니다. – GoodSp33d

관련 문제