在 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;
});
所以我对 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;
});