2016-12-04 4 views
1

Я пишу службу, которая возвращает функцию, но функция не возвращает значение. Вот код:async function in angularjs app

function getUser() { 
    var Users = $resource('/api/users',{},{query: {method: 'get', isArray: true}}); 
    return Users.query({username:localStorage.getItem("token")}).$promise 
} 

function userrole() { 
    var userrole=''; 

    var tmp=getUser(); 
    tmp.then(function(user){ 
     var userrole= user[0].role; 
     console.log('The role is '+user[0].role); 
     userrole=user[0].role; 
     return userrole; 
    }); 
    console.log('@ the end of userrole'); 
} 

Функция, которая не возвращает является userrole. Я считаю, что это из-за проблемы асинхронности. Как я могу решить это?

+0

Что вы видите в консоли? – GMaiolo

ответ

1

Если вы используете методы async в AngularJS (и во всем Javascript), вам нужно всегда использовать его в функциях выше.

Например:

function getUser() { 
    var token = localStorage.getItem('token'); 

    var Users = $resource('/api/users', {}, { 
    query: {method: 'get', isArray: true} 
    }); 


    return Users.query({username: token}).$promise; 
} 

function getUserRole() { 
    return $q(function(resolve, reject) { 
    getUser() 
     .then(function(user){ 
     resolve(user[0].role); 
     }) 
     .catch(reject); 
    }); 
} 

getUserRole().then(function (userRole) { 
    console.log('The role is ' + userRole); 
}); 
+0

[$ q] (https://docs.angularjs.org/api/ng/service/$q) - простой аналог Promise в AngularJS –

+2

getUser, очевидно, уже возвращает обещание, зачем строить другое ? – danh

+0

@danh. GetUser возвращает пользовательские данные. GetUserRole обрабатывает ответ пользователя и возвращает роль пользователя. Мы можем добавить любого обработчика в getUserRole и использовать его. –

1

Не знаете, чего вы пытаетесь достичь, но просто верните return tmp.then(..., тогда, когда вы сможете позвонить userrole().then((role) => ...) с другого места. Кроме того, исправить ваши отступы.

+1

Этот ответ означает (правильно), что функция async не может вернуть роль пользователя, она может/должна вернуть обещание получить роль пользователя. – danh

+0

@ danh 10x и как я могу манипулировать данными из запроса –

+0

@julianaMorales Что вы понимаете, манипулируя данными из запроса? Если обещание будет успешным (например, запрос), тогда вы можете вызвать '.then ((dataReturnedFromPromise) =>'. Вот и все, и если вы связываете обратные вызовы '. Then', тогда следующая функция' then' вернет все, что вы вернули в предыдущий '. then' обратный вызов. –