2013-07-31 46 views
0

東西,我有一個數組在其他結構中聲明陣列不保留的內容,可能與申報

var days = new Array(); 
$.ajax({ 
     url: 'someurl', 
     dataType: 'jsonp', 
     success: processJSON 
}); 

我處理來自Ajax調用的數據在processJSON功能

function processJSON(jsonData) { 
    var weather = jsonData.data.weather; 
    for(var key in weather) { 
     var day = weather[key]; 

     days.push(new Array(day.tempMaxC, day.type)); 
    } 
} 

我向days-array添加一些其他數組。

如果我簽在控制檯(在processJSON功能),長度爲三/

然後,當我想用​​變量下的AJAX調用一些代碼,沒有什麼工作,當我檢查它的長度是0.我想這是聲明的東西?

+2

AJAX是** **異步的,所以當你說你要使用它的代碼AJAX調用下,它最有可能還沒有被填充然而。在你的'processJSON'事件中做你需要做的事情,或者添加另一個回調。 – tymeJV

+0

...並參閱[JavaScript控制檯懶惰評估數組?](http://stackoverflow.com/questions/4057440/is-chromes-javascript-console-lazy-about-evaluating-arrays)爲什麼你在控制檯中看到它。 – Bergi

回答

1

之外是Ajax調用的函數processJson後發生在你的代碼?對ProcessJson函數的調用是異步的,只有在Ajax調用完成後纔會發生。但是之後的代碼可能會在之前發生。所以這可能是一個計時的事情。如果您需要該陣列進行任何其他處理,則應在回調中或在知道回調已完成後進行處理。

+0

謝謝,愚蠢的錯誤,但從現在開始我會記住。 – Veltar

0

把申報條件/其他

var days = new Array(); 
if(...){ 
}else{ 
$.ajax 
} 
+0

會發生什麼變化? – Bergi

0

您需要等到XHR調用完成。看起來您正在使用JQuery,因此請查看延期文檔(http://api.jquery.com/deferred.then)。

你會用這樣的結尾:

$.ajax({ 
     url: 'someurl', 
     dataType: 'jsonp' 
}).then(function(jsonData) { 
    var weather = jsonData.data.weather; 
    for(var key in weather) { 
     var day = weather[key]; 
     days.push(new Array(day.tempMaxC, day.type)); 
    }   
    console.log('done!', days); 
}); 
+0

在通話結束後,他*會用'processJSON'等待。你應該專注於不等待的事情...... – Bergi