2016-04-08 2 views
0

Итак, у меня есть немного путаницы с угловыми обещаниями.Найти и вернуть товар в Угловое отложенное обещание

У меня есть службы, сохранение списка пользователей

.service('user', ['$q','$http', function ($q, $http) { 
var services = {}; 

var _def_userLsit = $q.defer(); 

$http.get('/api/acc/getlist').then(function (data) { 
    _def_userLsit.resolve(data); 
}) 

services.getUserListQ = function() { 
    return _def_userLsit.promise; 
} 
return services; 
}]) 

после введения его, я могу загрузить мой список, как это в контроллере:

  user.getUserListQ().then(function (promise) { 
      $scope.userHelper.userList = promise.data; 
     }); 

не проблема здесь, получил JSON в области $ scope, наблюдатели выполняют свою работу отлично.

Здесь формат Json упрощены для вопроса:

OBJ 1 {ID = 4, UserName = "foohuman", $$ hashKey = "объект: 14"} OBJ 2 {ID = 444, имя пользователя = "barhuman", $$ hashKey = "object: 22"}

Но я также хочу, чтобы имя пользователя по id, и мне нужно запустить его несколько раз (в зависимости от количества сообщений).

Так что мой вопрос здесь в том, как я могу вернуть имя пользователя, как вызов функции, из обещанного списка.

как нормальная функция будет делать, как это:

$scope.getUserById = function( id){ 
    return "foo"; 
    //some magic needed here 
} 

Если я просто перебирать корыта userHelper.userList, это может быть пустым, если он работает слишком рано, так что мне нужно загрузить, что корыта обещание , но загружая его, итерируя корыто, то добавление строки в область $ не является лучшим вариантом, так как оно может выполняться несколько раз, поэтому оно может перезаписывать друг друга, довольно непредсказуемо, если я храню его в одной переменной.

Итак, любая идея, как я могу вернуть приятную простую строку по id, а не обещание?

EDIT: Хорошо, поэтому я не могу вернуть хорошую строку, потому что это должен быть какой-то обратный вызов, но я могу обработать данные из обещания, поэтому я закончил загрузку пользовательских данных в массив, это:

user.getUserListQ().then(function (promise) { 

      var uArr = []; 
      angular.forEach(promise.data, function (value, key) { 
       uArr[value.id] = value.userName; 
      }) 

      $scope.userHelper.uArr = uArr; 

     }); 

и в HTML, я могу смело писать {{userHelper.uArr[taskData.tOwner]}}.

+1

Избегайте [отложенные антипаттерны] (http://stackoverflow.com/q/23803743/ 1048572)! – Bergi

ответ

1

Прежде всего, вы делаете обещания труднее, чем они должны быть, используя explicit construction antipattern. Ваш первый фрагмент кода можно заменить следующим образом:

.service('user', ['$q','$http', function ($q, $http) { 
    var services = {}; 

    var pUserList = $http.get('/api/acc/getlist'); 

    services.getUserListQ = function() { 
     return pUserList; 
    }; 

    return services; 
}]); 

Что касается Вашего вопроса:

Таким образом, любая идея, как я могу вернуть хорошую простую строку по идентификатору, а не обещание?

Это неправильный образ мышления. Чтобы получить пользователя по их идентификатору, вам нужно подумать с точки зрения обещаний. Вы точно не знаете, когда данные будут готовы, поэтому это означает, что ваш метод getUserId должен вернуть обещание.Вы можете написать это:

services.getUserById = function (id) { 
    return pUserList.then(function (users) { 
     return users.filter(function (user) { return user.id === id; })[0]; 
    }); 
}; 

в контроллере, вы можете использовать его как этот:

myService.getUserById(4).then(function (user) { 
    $scope.myUser = user; 
}); 
Смежные вопросы