Правильный шаблон для возврата результатов рекурсивного вызова AJAX (Microsoft AJAX)
Я использую следующую функцию (код сильно удален для проверки шаблона), чтобы получить все списки определенного SP.ListTemplateType из семейства сайтов. Поскольку MS 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)
});
1 ответ
Это кажется правильным, за исключением того, что ваш обратный вызов никогда не будет вызван, если первый запрос Ajax вернет ошибку.
Выполните ту же проверку в errorHandler(), что и в successHandler():
function errorHandler(sender, args) {
queue--;
if (queue == 0) {
callback(returnListArray);
}
}