Угловое обещание "неопределено" в странном темпе
Мне нужна помощь с 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;
});
}