2013-04-09 6 views
0
내가 문제를 내가 잘 작동 배열에 삽입 후 바로 정보를 경고하는 경우, 아약스 호출에서 배열로 내 정보를 얻는 데

을 잃고,하지만 난 마지막에 그것을 할 경우에는 경고 불확실한. 나는 그것이 책을 방해하지 않도록 외부에 선언했는지 확인했다.자바 스크립트 배열 데이터

  var books = []; 
     $.ajax({ 
       url: 'getFolderContents.php', 
       dataType: 'json', 
       success: function (data) 
       {  
        for(var i=0;i<data.length;i++) { 
         var amm = 0; 
         if(data[i].indexOf(".epub") !== -1) { 
          //$('#bTable').append("<td><a id = '" + data[i] + "' href = 'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
          books.push(data[i]); 
          //alert(books[0]) Works if I call it from here, but not at the end. 
         } 
        } 
       }, 
       error: function() 
       { 
       alert("error"); 
       } 
     }); 
     alert(books[0]); 
+2

아약스는 비동기이므로 실제로 경고합니다 (books [0]); ajax로 채워진 배열보다 먼저 호출 할 수 있습니다. 성공 방법으로 인쇄해야합니다. –

답변

3

귀하의

alert(books[0]); 

는 Ajax 호출이 실행되는 동안 실행되고, 따라서 아직 실행이 시점에서 어떤 요소가되지 않습니다. Ajax는 비동기식입니다 - PHP 스크립트에 요청을하는 동안 스크립트는 계속 실행됩니다.

당신의 success 기능에 books 모든 조치를 넣습니다.

또 다른 힌트 : jQuery를 버전 1.8으로 당신이 더 이상 동기 "A"JAX 호출을 생성하기 위해 매개 변수 async: false을 사용할 수 없습니다. 콜백 함수를 사용해야합니다. 귀하의 배열이 모든 데이터를 손실하지 않은 the docs for $.ajax

+0

하지만 호출 후 배열을 사용하려면 어떻게해야합니까? 완성을 위해 별도의 함수 안에 아약스 호출을 넣어야합니까 아니면 작동하지 않을까요? 고마워 btw :) – Crossman

+0

배열을 사용하려는 경우이 배열에 관련된 모든 액션을'success' 함수에 넣으십시오 (성공 함수에서 다른 함수를 호출하여 코드를보다 명확하게 만들 수 있습니다). – akluth

+0

배열을 사용하는 코드가 성공 처리기에서 실행되거나 성공 처리기에서 호출되지 않으면 배열에 데이터의 존재를 보장 할 수 없습니다. 따라서 AJAX 호출을 이동하면 도움이되지 않습니다. 채워진 배열을 사용하여 실행하려는 코드를 자체 함수에 넣을 수 있으며 성공 핸들러 함수 내에서 해당 함수를 호출 할 수 있습니다. – ajp15243

0

AJAX 호출이 비동기 적이므로 정의되지 않았습니다.

3

에서보세요; 데이터가 아직 입력되지 않았습니다. 'A'는 '비동기'를 의미합니다. 즉, 경고 콜을 할 때 성공 콜백이 아직 실행되지 않았 음을 의미합니다.

대신 콜백 내부의 경고를 넣어 : 말

 success: function (data) 
      {  
       for(var i=0;i<data.length;i++) { 
        var amm = 0; 
        if(data[i].indexOf(".epub") !== -1) { 
         //$('#bTable').append("<td><a id = '" + data[i] + "' href = 'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
         books.push(data[i]); 
         //alert(books[0]) Works if I call it from here, but not at the end. 
        } 
       } 
       alert(books[0]); 
      }, 
0

경고가 아약스 성공 콜백 전에 발생, 아약스는 비동기이기 때문이다. 성공 함수가 호출되기 전에

1

귀하의 경고가 실행됩니다. 약속을 사용하여 동일한 코드를 보는 것이 더 명확 해집니다.

$.ajax(url: 'getFolderContents.php', dataType: "json" ) 
//the then function's first argument is the success handler 
    .then(function(data) { 

     for(var i=0;i<data.length;i++) { 
         var amm = 0; 
         if(data[i].indexOf(".epub") !== -1) { 
          //$('#bTable').append("<td><a id = '" + data[i] + "' href =      'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
          books.push(data[i]); 
          //alert(books[0]) Works if I call it from here, but not at the end. 
         } 

alert(books[0] 
        }); 

}); 

언제나이 구문이 비동기적인 요소를 더 잘 이해한다고 생각합니다. 그렇지 않으면이 코드는 Blazemonger의 정답과 정확히 일치합니다.