user3443245
user3443245

Reputation:

Order function call

I need to make submitAdapterAuthentication() function to work the first getUserRoles() function, but with the current implementation of the getUserRoles() function is being executed first that submitAdapterAuthentication(). How can I fix this?

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

Upvotes: 0

Views: 50

Answers (1)

Dan Cohen
Dan Cohen

Reputation: 151

When chaining promises, if you return anything but another promise from a then() callback, the resulting promise will be resolved immediately with the value undefined.

In order to make sure your callbacks are executed in the order you specified, just make sure each callback is returning a promise at the end. If you want to return some value from a callback, wrap it in a $q.when(). In this case it looks like you are not using any intermediary return values, so you can just wrap any arbitrary value in a $q.when() to make sure a promise is returned:

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

Based on your latest edit, it looks like ch.submitAdapterAuthentication() is likely returning a promise. If this is the case, you should return this promise from the function: return ch.submitAdapterAuthentication(invocationData, {... And then return this promise in the then callback: then(function() {return submitAdapterAuthentication(user, pass);})

If ch.submitAdapterAuthentication() does not return a $q promise, you will have to wrap it yourself:

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;

Upvotes: 2

Related Questions