2012-02-03 127 views
1

我有兩個函數,一個函數是一個重載函數,它執行ajax Web調用來獲取數據。另一個是加載數據的項目加載器。問題在於加載數據項的函數由於ajax調用而沒有值。無論如何修復這個除了調用setTimeout?預先感謝您的幫助。javascript競爭條件問題

function reload(index) { 
    _ListData[index] = null; 
    DisplayInformation.GetTemplateTableInformation(
     ListManager.listReportId(), 
     ListManager.listParameters(), 
     ListManager.listSortParams(), 
     TableReportHelper_TemplateRelatedAction, 
     reloadRange.min, 
     reloadRange.num, 
     function(templateItemIfo) {//success callback causes issues with race conditon in the function itemLookaheadCallback because _ListData[index] = null; 
      itemLookaheadCallback(templateItemIfo, index); 
     }); 
} 

這裏是一個嘗試加載被稱爲於重載回調

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    //Store the received value 
    var item = _ListData[index];//this will be null because of _ListData[index] = null; 
    item.data = lookAheadData.TemplateInformation; 

}; 
+1

你可以減少你的代碼只是問題的本質嗎? – 2012-02-03 16:17:32

+0

+1以上。缺少上下文。用更通用的方式描述這個問題。 – 2012-02-03 16:24:11

+0

對不起,我簡化了代碼一行var item = _ListData [index];將是空的,這就是問題所在。函數重載回調itemLookaheadCallback不會足夠快地設置索引項目。 – user516883 2012-02-03 16:26:24

回答

2

該項目將代碼加載「成功回調」裏面的物品的功能。

或者,使AJAX調用同步,儘管應該避免這種情況,因爲在慢速連接或大量數據時,它可能看起來像您的頁面已凍結。

-1

您可以在ajax調用中使用async = False進行同步調用。例如:

$.ajax({ 
      type: 'GET', 
      url: '/yourUrl/', 
      dataType: 'json', 
      success: function(data) { 

      }, 
      data: {}, 
      async: false 
     }); 

p.s .:使用jQuery在這裏創建Ajax調用。

+0

[**從不**使同步AJAX調用。](http://stackoverflow.com/a/7337091/201952) – josh3736 2012-02-03 16:48:11

+0

@ josh3736爲什麼?不要在沒有解釋的情況下做出如此強有力的明確陳述! – Sid 2012-02-03 16:49:49

+0

點擊鏈接。同步通話會凍結瀏覽器用戶界面,這是令人尷尬的用戶體驗。 – josh3736 2012-02-03 16:55:17

0

我知道這看起來像是一種競爭條件,但我會走出去並建議它實際上是一個範圍問題。

_ListData存在於reload()函數內部,並且如果我正確記得回調函數可能會繼承該範圍並仍然使其可訪問一個深度級別。

function reload(index) { 
    _ListData[index] = null; 
    ... 
} 

回調回調(它看起來像你可能會做)的可能將失去該範圍內,並以完全匿名的範圍存在。

reload -> itemLookaheadCallback -> loadDataCallback 

解決方案?考慮使用window爲該變量定義全局可訪問的位置。 (window永遠是全球性的)。

這裏的變化,將做到這一點:

function reload(index) { 
    window._ListData[index] = null; 
    ... 
} 

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    var item = window._ListData[index]; 
    ... 
}; 

無論如何,這只是一個猜測。可能是錯誤的,但相對容易驗證。