等待executeQueryAsync准备就绪的JavaScript函数

JavaScript function that waits until executeQueryAsync is ready?

本文关键字:JavaScript 函数 准备就绪 executeQueryAsync 等待      更新时间:2023-09-26

有可能延期吗?我在while循环中调用函数。这个函数调用executeQueryAsync,它必须在循环继续之前完成。当我使用警报时,我的代码可以工作,但没有它就不行。

    while (listPermsEnumerator.moveNext()) {
        enumG = groups.getEnumerator();
        var rAssignment = listPermsEnumerator.get_current();
        var member = rAssignment.get_member();
        var groupCounter = 1;
        var name = '';
        //alert(''); This alert makes code work
        while (enumG.moveNext()) {
            var group = enumG.get_current();
            var groupname = group.get_title();
            //alert(groupname);
            if (member.get_title() === groupname) {
                name = groupname;
                SP.SOD.executeOrDelayUntilScriptLoaded(function(){
                    retrieveAllUsersInGroup(groupname, groupCounter, groups);
                }, key);
            }
            groupCounter++;
        }
        roleAssignment = this.listRoleAssignments.getByPrincipalId(member.get_id());
        roleBindings = roleAssignment.get_roleDefinitionBindings();
        // in checkPermission() another executeQqueryAsync is called
        checkPermission(context, roleAssignment, roleBindings, name);
    }
    ...
    function checkPermission(context, roleAssignment, roleBindings, name) {
        this.name = name;
        context.load(roleAssignment);
        context.load(roleBindings);
        context.executeQueryAsync(Function.createDelegate(this, Bind), Function.createDelegate(this, BindFail));
    }

最简单的解决方案是以一种反映异步操作目的的方式编写方法。您似乎试图围绕ExecuteQueryAsync工作,并试图"使"它同步。

这里有一个类似的例子——参见第二个答案:(https://sharepoint.stackexchange.com/questions/95907/executequeryasync-in-for-loop)基本上你a)内联编写回调函数,b)在成功回调中放入循环。

(在行中编写"success"回调函数的好处是成功回调函数可以访问方法中的所有变量。这是一个闭包)。

如果需要循环遍历异步作业数组,可以这样做:

var reports = [11, 12, 14, 15];
function doTheReport() {
    if (reports.length === 0) {
        alert('All reports are done now.');
        return;
    }
    var report_Id = reports.pop();
    $.ajax({
        url: "/DoTheReport",
        complete: function () {
            doTheReport();
        }
    });
};