Правильный шаблон для возврата результатов рекурсивного вызова 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);
    }
}
Другие вопросы по тегам