2012-03-29 2 views
0

아무도 나에게 빈 문자열을 제공하는 이유를 말해 줄 수 있습니까? $.get() 콜백 함수에있는 console.log(contentArray)에 콜백 함수가 표시되면 데이터가 표시되지만 아래 코드의 위치에서 데이터를 표시하려고하면 결과가 비어 있습니다..get 호출에서 jQuery .push를 호출하면 빈 결과가 나타납니다.

sectionArray = []; 
contentArray = []; 
$(function() { 
    if (index == 1) { 
     $('menu:eq(' + (section - 1) + ') li a').each(function() { 
      sectionArray.push($(this).attr('href')); 
     }); 

     var len = sectionArray.length; 

     for (var i = 0; i < len; i++) { 
      href2 = sectionArray[i]; 

      $.get(href2, function (data) { 
       string = data.toString(); 
       contentArray.push(string); 
      }); 
     } 
     content = contentArray.toString(); 
     console.log(content); 
    } 

답변

2

당신이 전화 후 아약스 요청이 종료 때문에 console.log()이 시도 :

$.get(href2, function(data){ 
    string = data.toString(); 
    contentArray.push(string); 
    content = contentArray.toString(); 
    console.log(content); 
}); 

또한 루프에서 아약스 요청을 할 수있는 가장 좋은 방법이되지 않습니다. 당신이 원하는대로 일하지 않을 것입니다.

UPDATE :

또한 jQuery를 false로 async 옵션을 설정하고 코드가 작동해야하지만 느린 작동합니다. 동기식 요청은 일시적으로 브라우저를 잠글 수 있습니다.

var countRequests = len; 
$.get(href2, function(data){ 
    string = data.toString(); 
    contentArray.push(string); 
    countRequests = countRequests - 1; 
    if (countRequests == 0) { 
     content = contentArray.toString(); 
     console.log(content); 
     // or create callback 
    } 
}); 
+0

, $ 갔지 (href2, 기능 (데이터) { 내용 때문에 = contentArray.push (데이터); console.log (콘텐츠); }); 작품입니다. 제가 시도 $ 갔지 (href2, 기능 (데이터) = { 문자열 data.toString(); contentArray.push (문자열) }); 콘텐츠 = contentArray.toString(); console.log (content); 그러나 그것은 작동하지 않습니다 – Psylant

+0

왜냐하면'.push()'가'console.log()'다음에갑니다. – Vytautas

+0

여러 페이지에서 데이터를 수집 한 다음 1 페이지로 떨어 뜨려야하기 때문에 반복해야합니다 – Psylant

1

문제는 당신 $.get() 아약스 요청을 비동기 적으로을 실행하는 것입니다 :

UPDATE 것은 2

어쩌면이 같은 (: D 아마 그렇게 좋은 생각)를보십시오. 이다

에서, $.get() 기능은 응답을 기다리지 않고 즉시을 반환 루프 전체는 다음 console.log()이되는 배열이 여전히 비어 포인트 발생 (여러 아약스 요청을 대기) 완료됩니다. 그 후에야 아약스 응답 처리 속도가 어떻든간에 아약스 성공 핸들러 중 하나라도 호출됩니다.

편집 : 여기에 모든 아약스 호출을 완료 한 후 일을 수행하는 방법을 보여줍니다 또 다른 질문의 응답은 다음과 같습니다 작동 https://stackoverflow.com/a/6250103/615754

+0

ahhh 그래, 내가 루프를 완료 한 후에 실행해야하는 l> len을 실행하기 위해 거기에 if 문을 넣으면 좋다. – Psylant

+0

아니요, 성공한 콜백이 실행되기 전에 for 루프가 끝나기 때문에 console.log()를 콜백으로 이동하고 수신 한 응답 수를 유지하지 않으면 if 문이 작동하지 않습니다. 내가 링크 된 답변을 살펴보고 $ .when() 메소드를 읽으십시오. – nnnnnn

+0

실제로 그렇게하는 것이 실제로 좋은 방법입니다. 감사 – Psylant

관련 문제