1

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

如果第一次调用在第二次调用之前返回,这似乎(可能)容易出错。到目前为止,即使在 20 多次递归的情况下,第一个调用直到最后一次调用才返回,因此队列似乎是安全的。

这是错的,还是我做对了?

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)
});
4

1 回答 1

2

这似乎是正确的,只是如果第一个 Ajax 请求返回错误,您的回调将永远不会被调用。

Do the same check into errorHandler() than the one done into successHandler():

function errorHandler(sender, args) {
    queue--;
    if (queue == 0) {
        callback(returnListArray);
    }
}
于 2013-01-20T22:54:15.823 回答