-1

多少遅れる可能性はありますか?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));
    }
4

2 に答える 2

1

最も簡単な解決策は、非同期操作の目的を反映する方法でメソッドをコーディングすることです。あなたは ExecuteQueryAsync を回避しようとしていて、それを同期させようとしているようです。

同様の例を次に示します-2番目の回答を参照してください:( https://sharepoint.stackexchange.com/questions/95907/executequeryasync-in-for-loop )基本的に、a)コールバック関数をインラインで記述し、b)配置します成功コールバックのループ。

(「成功」コールバック関数をインラインで記述することの優れている点は、成功コールバック関数がメソッド内のすべての変数にアクセスできることです。これはクロージャです)。

于 2015-09-27T16:47:18.393 に答える