返回递归AJAX调用结果的正确模式(Microsoft AJAX)

时间:2013-01-19 07:17:59

标签: ajax sharepoint-2013 microsoft-ajax

我正在使用以下函数(为了模式检查而大量删除的代码)从网站集中获取某个SP.ListTemplateType的所有列表。由于MS AJAX不包含$ promise函数(据我所知),我创建的队列在调用时递增,并在调用返回时递减,成功或错误。

如果在第二次调用之前返回第一个调用,这似乎(可能)容易出错。到目前为止,即使在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 个答案:

答案 0 :(得分:2)

这似乎是正确的,除非在第一个Ajax请求返回错误时永远不会调用回调函数。

对errorHandler()的检查与对successHandler()的检查相同:

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