2013-01-19 67 views
1

我使用以下函數(爲了模式檢查而大量刪除代碼)從網站集合中獲取某個SP.ListTemplateType的所有列表。由於MS AJAX不包含$ promise函數(就我所知),我創建了一個隨着調用而增加的隊列,並且隨着調用被成功或錯誤地返回而遞減。返回遞歸AJAX調用結果的正確模式(Microsoft AJAX)

如果第一次調用在第二次調用之前返回,這似乎(可能)容易出錯。到目前爲止,即使在20次遞歸的情況下,第一次調用也不會返回,直到最後一次調用爲止,所以隊列SEEMS是安全的。

這是錯誤的,或者我是否正確地做到了這一點?

function allListsOfType(type, callback) { 
    //setup context, etc... 

    var returnListArray = []; 
    var queue = 0; 

    getListsFromWeb(web); 

    function getListsFromWeb(targetWeb) { 
     //get lists from root web, and get all subwebs 
     context.load(objects); 
     queue++; 

     context.executeQueryAsync(
      Function.createDelegate(this, function() { successHandler(); }), 
      Function.createDelegate(this, errorHandler) 
     ); 
    } 

    function successHandler() { 
     //add list results to array 
     //loop through subwebs and call getListsFromWeb() 
     queue--; 
     if (queue == 0) { 
      callback(returnListArray); 
     } 
    } 

    function errorHandler(sender, args) { 
     queue--; 
    } 
}; 

allListsOfType(SP.ListTemplateType.announcements, function(arr){ 
    alert(arr.length) 
}); 

回答

2

這似乎是正確的,但如果第一個Ajax請求返回一個錯誤,你的回調將不會被調用。

做得比一個做成successHandler()相同的檢查到的ErrorHandler():

function errorHandler(sender, args) { 
    queue--; 
    if (queue == 0) { 
     callback(returnListArray); 
    } 
}