javascript - 带有延迟的嵌套 context.executeQueryAsync

标签 javascript arrays sharepoint office365 sharepoint-jsom

如何将嵌套 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 的数组并迭代所有术语。

在迭代过程中,首先,我将项插入该数组中,与此同时,我还获取它的子项(如果有)并将其插入同一个数组中。

我希望代码在第二个循环完成执行之前不会进一步执行。这样我就可以得到最终的数组,同时将其返回给另一个函数。

最佳答案

I want that code doesn't execute further until second loop completes it's execution. So that I will have final array while returning it to another function.

在这种情况下,您需要为每个executeQueryAsync 延迟。

然后,您需要创建一个整体延迟来等待所有异步方法完成。

以下是示例代码供您引用:

(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); 

enter image description here

关于javascript - 带有延迟的嵌套 context.executeQueryAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36259167/

相关文章:

javascript - 如何选择数组的多个 html 元素并将它们一次性设置为一个函数?

c - 在 C 中,我正在为我的代码寻找一个简单的解决方案,该解决方案在输入包含 8 个或更多字母的单词之前一直有效

c# - Sharepoint 无法看到新部署的功能,也不会激活它们

asp.net - 有没有办法使用 sharepoint 作为我的自定义文档管理网站的后端版本控制和存储?

sharepoint - SharePoint 问题跟踪列表中的评论字段

Javascript JQuery 替换标签

javascript - 在另一个对象的 foreach 函数中访问对象的 "this"?

java - 如何在其适配器内的 recyclerview 元素之间移动

javascript - 使用 Javascript 更改行元素,同时将所有内容保持在一行中

javascript - 我无法从 Node js + Express JS 中的 req.body 获取数据