Угловое обещание "неопределено" в странном темпе

Мне нужна помощь с Angular и обещаниями, так как я определенно делаю что-то не так:

var rootModule = angular.module('ims2Root',[]);

rootModule.controller('RootController', ['$q', '$scope', '$http', '$state', 'user', function ($q, $scope, $http, $state, user) {
$scope.title = "IMS2";

user.getUserList().then(function (data) {
   console.log('loaded' , data.data);
   console.log('fuuu', user.getUserName(1));
});
console.log('fooo', user.getUserName(1));

}]);

rootModule.factory('user', ['$q','$http', function ($q, $http) {

var services = {};

services.getUserList = function () {
    return $http.get('/api/acc/getlist');
}

services.getUserName = function (id) {      
    this.getUserList().then(function (data) {
        angular.forEach(data.data, function (val, key) {
            if (data.data[key].id == id) {
                console.log('found',val, data.data[key].userName);
                return data.data[key].userName;
            }
        })
        return 'not found:' + id;
    });        
}

return services;
}]);

выход:

fooo undefined

loaded [Object { id=2,  userName="icn36101"}, Object { id=3,  userName="icn36115"}, Object { id=1,  userName="icn36121"}]

fuuu undefined

found Object { id=1,  userName="icn36121"} icn36121

found Object { id=1,  userName="icn36121"} icn36121`

Итак, мой вопрос: как получилось, что getUserName() console.log действительно получил строку из правильного объекта, но его функция возвращает undefined.

В getUserName () возвращение происходит сразу после строки, в которой записано правильно найденное значение, так почему же журнал консоли в функции вызывается после возврата следующей строки?

1 ответ

Вы должны вернуть обещание от getUserName метод

services.getUserName = function (id) {      
    return this.getUserList().then(function (data) {
        angular.forEach(data.data, function (val, key) {
            if (data.data[key].id == id) {
                console.log('found',val, data.data[key].userName);
                return data.data[key].userName;
            }
        });
        return 'not found:' + id;
    });        
}
Другие вопросы по тегам