2015-11-21 2 views
0

Я работаю на функции пользователя аутентификации, которая работает в два этапа:Угловое обещание, которое использует другое обещание?

  • Один HTTP (отдых) называют получить и подтвердить личность пользователя
  • следует вызов на вторую систему, которая будет подтвердите «роли» пользователя (разрешения в системе).

Я не могу выполнить второй вызов до завершения первого вызова.

У меня есть сервис под названием UserService, которая имеет функцию немного как это:

UserService.load() # returns a promise which has when resolved gives the user's identity as a sring. 

Я хочу быть в состоянии сделать обернуть его так, что у меня есть:

RoleService.load() # returns a promise which when resolved gives the user's valid roles in the form ["role1", "role2", ... "roleN"] 

В для реализации RoleService.load(), я полагаю, я должен был бы сделать что-то вроде:

load:()-> 
if promise? 
    # Dont do anything if this promise is already cached 
    promise 
else 
    promise = UserService.load().then((standardId)=> 
    @set(@getRolesForUser(standardId)) 
) 

Какой-то работает ssuming, что getRolesForUser (u) возвращается мгновенно. Проблема в том, что этот второй звонок также будет в сети, поэтому его придется превратить в другое обещание.

То, что я действительно хочу сделать, это объединить обещания таким образом, что, разрешив первое обещание, то, что я перехожу на следующий этап цепи, является результатом второго обещания.

Можно ли это сделать? Что такое синтаксис?

ответ

1

ли что-то подобное, Подождите, пока один, чтобы закончить.

UserService.load() 
.then(function(res){ 
     var id = res.data.id; 
    RoleService.load() 
    .then(function(role){ 
     var roleId = role.id; // your logic 
    }) 
}); 

Еще один лучший подход - связать обещание.

UserService.load() 
.then(function(res){ 
    var id = res.data.id; 
    return RoleService.load(); 

}) 
.then(function(role){ 
     var roleId = role.id; // your logic 
}); 
1

Вы можете создать новый отложенный и вернуть свое обещание. Затем, когда у вас есть значение из второго вызова вы можете разрешить обещание:

function load() { 
    var deferred = $q.defer(); 
    UserService.load().then(function(standardId){ 
    getRolesForUser(standardId).then(function(val) { 
     deferred.resolve(val) 
    }) 
    }); 
    return deferred.promise; 
} 
Смежные вопросы