0

ネストされた context.executeQueryAsync を Deferred で使用するにはどうすればよいですか? 以下は私のコードです。私が探しているものを正確に説明します。

コード

function getValues() {
    var dfd = $.Deferred(function () {

        context.executeQueryAsync(function () {
            var navigationItem = [];

            // First Loop
            while (termEnumerator.moveNext()) {

                // Push Parent Terms in navigationItem array
                navigationItem.push({ "name": ""});

                // Get Sub Terms
                context.executeQueryAsync(function () {
                    // Second Loop
                    while (termsEnum.moveNext()) {
                       // Push Sub Terms in navigationItem array
                        navigationItem.push({ "name": ""});
                    }
                }, function (sender, args) {
                    console.log(args.get_message());
                });
            }

            dfd.resolve(navigationItem);

        }, function (sender, args) {
            console.log(args.get_message());
            dfd.reject(args.get_message());
        });
    });
    return dfd.promise();
}

基本的に、上記のコード構造を使用して、SharePoint Online で分類法 (用語とサブ用語) を取得しようとしています。最初に、名前を付けnavigationItemてすべての用語を反復処理する配列を作成しました。

反復中に、まず、用語をこの配列にプッシュします。これに加えて、サブ用語があればそれを取得して同じ配列にプッシュします。

2 番目のループの実行が完了するまで、コードがそれ以上実行されないようにしたいのです。そのため、別の関数に返すときに最終的な配列が得られます。

4

1 に答える 1

1

2 番目のループの実行が完了するまで、コードがそれ以上実行されないようにしたいのです。そのため、別の関数に返すときに最終的な配列が得られます。

この場合、executeQueryAsync ごとに defer が必要です。

次に、すべての非同期メソッドが完了するのを待つために、全体的な遅延を作成する必要があります。

参照用のサンプル コードは次のとおりです。

(function ($) {
    function executeQueryAsync(succeededCallback, failedCallback)
    {
        var period = Math.random() * 10000;

        setTimeout(function () {
            succeededCallback();
        }, period);

    }

    function forEachAsync(items, funcAsync, callback)
    {
        var count = 0;

        var total = $.Deferred();

        function increment()
        {
            count++;

            if(count == items.length)
            {
                total.resolve();
            }
        }

        for (var i = 0; i < items.length; i++)
        {
            (function exec(item) {
                var deferred = $.Deferred(function (defer) {
                    funcAsync(function () {
                        callback();
                        defer.resolve();
                    });
                });

                deferred.done(function () {
                    increment();
                });
            })(items[i]);
        }

        return total.promise();
    }

    var promise = forEachAsync([1, 2, 3, 4, 5], executeQueryAsync, function () {
        console.log('call back executing + ' + Date.now());
    });

    promise.done(function () {
        console.log("promise done");
    });
})(jQuery); 

ここに画像の説明を入力

于 2016-03-29T02:21:08.820 に答える