在 Angular 个延期承诺中查找并 return 项

Find and return item in Angular deferred promise

所以我对 angular promises 有点困惑。

我有一个服务,存储用户列表

.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;
        });

这里没问题,在 $scope 中得到 json,然后观察者就可以正常工作了。

这里是Json问题的简化格式:

obj 1 { id=4, 用户名="foohuman", $$hashKey="object:14"} obj 2 { id=444, 用户名="barhuman", $$hashKey="object:22"}

但我还想通过 ID 获取用户名,我需要 运行 多次(取决于 post 计数)。

所以我的问题是,如何从承诺的列表中 return 用户名,如函数调用。

就像一个普通的函数一样,像这样:

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

如果我只是遍历 userHelper.userList,如果它 运行 太早,它可能是空的,所以我需要通过承诺加载它,但是加载它,迭代槽,然后将字符串添加到 $scope 不是最佳选择,因为它可以 运行 多次,所以它可以相互覆盖,如果我将它存储在单个变量中,这是非常不可预测的。

那么知道如何通过 id return 一个漂亮的简单字符串,而不是一个 promise 吗?

编辑:好的,所以我真的 return 一个不错的字符串,因为它必须是某种回调,但我可以处理来自承诺的数据,所以我最终加载了用户将数据放入这样的数组中:

 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]}}.

首先,您使用 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;
}]);

关于您的问题:

So any idea how can i return a nice simple string by the id, and not a promise?

这是错误的心态。要通过 ID 获取用户,您需要考虑承诺。您不知道数据何时准备就绪,因此这意味着您的 getUserId 方法应该 return 一个承诺。你可以这样写:

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;
});