2015-08-07 2 views
0

Мне нужно сделать функцию 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); 
      } 
     } 
    } 

ответ

2

При объединении обещаний, если вы возвращаете что-нибудь, а другое обещание от то() обратного вызова, полученное обещание будет немедленно решено со значением undefined.

Чтобы убедиться, что ваши обратные вызовы выполнены в указанном вами порядке, просто убедитесь, что каждый обратный вызов возвращает обещание в конце. Если вы хотите вернуть некоторое значение из обратного вызова, оберните его в $q.when(). В данном случае это выглядит, как вы не используете промежуточные значения возврата, так что вы можете просто обернуть любое произвольное значение в $ q.when(), чтобы убедиться, что обещание возвращается:

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; 
+0

Я пытаюсь, но «атрибуты» в getUserRoles() возвращают только {}, как если бы submitAdapterAuthentication не было. Мой submitAdapterAuthentication http://stackoverflow.com/questions/28690354/submitadapterauthentication-not-working –

+0

Пабло, я вижу, что вы приняли ответ, значит ли это, что вы его заработали? Если у вас все еще есть проблемы, дайте мне знать, и я попытаюсь посмотреть на это немного глубже позже этим вечером. –

Смежные вопросы