订单功能调用

时间:2015-08-07 17:17:20

标签: javascript angularjs

我需要使submitAdapterAuthentication()函数能够处理第一个getUserRoles()函数,但getUserRoles()函数的当前实现首先执行submitAdapterAuthentication()。我该如何解决这个问题?

    checkOnline().then(function(onl) {
        userObj.isLoginOnline = onl;
    }).then(function() {
        submitAdapterAuthentication(user, pass);
    }).then(function() {
        getUserRoles();
    });


function submitAdapterAuthentication(user, pass) {
    var invocationData = {
        parameters : [ user, pass ],
        adapter : "adapterAuth",
        procedure : "submitLogin"
    };

    ch.submitAdapterAuthentication(invocationData, {
        onFailure : function(error) {
            WL.Logger.log("ERROR ON FAIL: ", error);
        },
        onSuccess : function() {
            WL.Client.updateUserInfo({
                onSuccess : function() {
                    //return promise
                    WL.Client.updateUserInfo({
                        onSuccess : function() {
                        }
                    });
                }
            });
        }
    });
}

 // my function to obtain roles 
    // It should be performed after submitAdapterAuthentication
    function getUserRoles(){
        var arrayRoles = [];
        var attributes = WL.Client.getUserInfo(realm, "attributes");
        if(attributes){
            if(attributes.roles){
                arrayRoles.push(attributes.roles);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

当链接promises时,如果你从then()回调中返回除了另一个promise之外的任何东西,则会立即使用值undefined解析生成的promise。

为了确保您的回调按照您指定的顺序执行,只需确保每个回调都在最后返回一个承诺。如果要从回调中返回一些值,请将其包装在$q.when()中。在这种情况下,看起来你没有使用任何中间返回值,所以你可以在$ q.when()中包装任意值以确保返回一个promise:

checkOnline().then(function(onl) {
    userObj.isLoginOnline = onl;
    return $q.when(true);
}).then(function() {
    submitAdapterAuthentication(user, pass);
    return $q.when(true);
}).then(function() {getUserRoles();});

根据您的最新修改,ch.submitAdapterAuthentication()似乎可能会返回一个承诺。如果是这种情况,您应该从函数返回此承诺: return ch.submitAdapterAuthentication(invocationData, {... 然后在当时的回调中返回此承诺: then(function() {return submitAdapterAuthentication(user, pass);})

如果ch.submitAdapterAuthentication()没有返回$ q承诺,则必须自己包装:

var deferred = $q.defer();
ch.submitAdapterAuthentication(invocationData, {
    onFailure : function(error) {
        WL.Logger.log("ERROR ON FAIL: ", error);
        deferred.reject(error);
    },
    onSuccess : function() {
        WL.Client.updateUserInfo({
            onSuccess : function() {
                deferred.resolve();
            }
        });
    }
});
return deferred.promise;