2014-05-02 66 views
0

我試圖循環訪問S3存儲桶中的每1000個元素。這是因爲獲取請求返回的最大數量爲1000個元素。如果有超過1000個元素,則它會分頁,並且get請求將返回字段調用IsTruncated爲true,並將標記(NextMarker)元素傳遞給下一個調用,讓下一個獲取請求在接下來的1000個元素處開始。Javascript全局變量未在回調中修改

我從get請求中獲取數據作爲回調函數中的一個參數,並嘗試將這兩部分上述信息存儲在全局變量中以用於外部循環。但是,由於全局變量在我的get請求回調函數中永遠不會被修改,所以外層循環會無限延伸。我試過在回調中使用window.variable無濟於事。任何人都可以幫助我重組這些代碼來完成我的目標嗎?

謝謝

爲了調試目的,Outter循環被註釋掉。我用來確定問題的根源有一些調試console.log語句。

   <script type="text/javascript"> 
        s3_bucket = "link_to_s3_bucket"; 
        var go = true; 
        var marker = ""; 
        //while(go){ 
          console.log('pass'); 
          console.log(s3_bucket + marker); 
          $.get(
            s3_bucket+marker, 
            "{}", 
            function(data) { 
              $(data).find('Key').each(function(i, key) { 
                key = key.innerHTML; 
                $("<a />", { 
                  href : s3_bucket+key, 
                  text : key 
                }).prependTo("#links"); 
              $("<br />").prependTo("#links"); 
              }); 
              window.go = $(data).find('IsTruncated')[0].innerHTML; 
              window.marker = "&marker=" + $(data).find('NextMarker')[0].innerHTML; 
            }, 
            "xml" 
          ); 
        //} 
        console.log(go); 
        console.log(marker); 

      </script> 

回答

1

您的數據從Amazon異步返回,所以當您調用這些控制檯日誌時,這些變量尚未定義。在變量賦值後將控制檯日誌放入回調中。

+0

是的,我已經這樣做了,它實際上打印了正確的值,但它對我沒有多大幫助,因爲我需要在全局環境中更改變量賦值以使我的循環正常工作。 – user3594685

+0

它們是全球性的,因爲它們位於作爲瀏覽器全局對象的窗口對象上,所以它們正在改變。 – adrichman

+0

@ user3594685 - 他們正在改變。直到'$ .get()'函數異步完成(這意味着稍後的某個時間),新值纔會出現。如果你想使用來自Ajax調用的返回結果,你必須在Ajax調用的完成處理程序中使用它,或者通過將使用它的代碼放在那裏,或者從那裏調用一個函數並將數據傳遞給它。你不能像你所做的那樣僅僅從一個全局變量中使用它。如果你打算使用'$ .get()'異步調用,你必須異步編程。 – jfriend00