我需要使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);
}
}
}
答案 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;