1

次の関数(パターン検査のためにコードを大幅に削除)を使用して、サイトコレクションから特定のSP.ListTemplateTypeのすべてのリストを取得しています。MSAJAXには(私の知る限り)$ promise関数が含まれていないため、呼び出しが行われるとインクリメントし、呼び出しが正常にまたはエラーで返されるとデクリメントするキューを作成しています。

2番目の呼び出しが行われる前に最初の呼び出しが返される場合、これは(おそらく)エラーが発生しやすいようです。これまでのところ、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)
});
4

1 に答える 1

2

これは正しいようですが、最初のAjaxリクエストがエラーを返した場合にコールバックが呼び出されることはありません。

successHandler()に対して行ったのと同じチェックをerrorHandler()に対して行います。

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