Angular 中的承诺工厂
Promise factory in Angular
Angular 的新手,可能使用了错误的承诺。我有一家工厂 return 承诺:
.factory('myData', ['$http', '$q', function($http, $q) {
var deferred = $q.defer();
$http.get('/path/to/endpoint')
.success(function(data) {
deferred.resolve(data);
})
.error(function(err) {
deferred.reject(err.what())
});
return deferred.promise;
}])
现在,如果我将我的工厂注入某个地方,我就可以使用承诺:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
myData.then(function(result) {
$scope.data = result;
});
}]);
这很好,但我开始在几个地方使用 myData
,我不想在我使用数据的每个指令和控制器中编写新的 .then
. promise resolve后我就不管了,有什么办法可以让myData
return未resolved的promise而return只是resolved后的结果?
换句话说,myData
可以简单的是解析后的.then
result
吗,还是每次都要写一个新的.then
?
是的,解决 service/factory 中的承诺并在控制器中引用已解决的承诺值,而不是在控制器中引用和处理承诺。希望这是有道理的。
关于使用 promises
首先,您的 myData
服务只能 return 呼叫:
.factory('myData', ['$http', function($http) {
return $http.get('/path/to/endpoint').then(function(req){
return req.data;
});
}]);
展开值
所以你知道如何在 Angular 中使用承诺...
但是,您想要更好的东西,您希望承诺自动用 Angular 的摘要解包。这很棘手,但可以做到。请注意,它可能会使代码混乱,我并不真正推荐它,但这是一般的想法:
自动展开
.factory('myData', ['$http', function($http) {
var result = []; // initial result to return
var p = $http.get('/path/to/endpoint').then(function(res){
result.push.apply(result, res.data); // add all the items
});
result.then = p.then; // allow hooking on it
return result; // return the array, initially empty
}]);
这会让你做类似的事情:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
$scope.data = myData;
}]);
这将在其中放置一个空数组并在实际数据到达时替换它(也会导致摘要),您仍然可以执行 myData.then
以检查它是否已完成加载,以便您可以使用如果您需要确定,请使用旧语法。
这是个好主意吗?
请注意,Angular 在 1.2 版(在 1.3 中完全删除)之前曾这样做过,但由于自动解包被认为太神奇而停止这样做。您可以制定自己的决定,但请注意 Angular 核心团队认为这不是一个好主意。请注意,像 ngResource 这样的东西仍然会这样做。
Angular 的新手,可能使用了错误的承诺。我有一家工厂 return 承诺:
.factory('myData', ['$http', '$q', function($http, $q) {
var deferred = $q.defer();
$http.get('/path/to/endpoint')
.success(function(data) {
deferred.resolve(data);
})
.error(function(err) {
deferred.reject(err.what())
});
return deferred.promise;
}])
现在,如果我将我的工厂注入某个地方,我就可以使用承诺:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
myData.then(function(result) {
$scope.data = result;
});
}]);
这很好,但我开始在几个地方使用 myData
,我不想在我使用数据的每个指令和控制器中编写新的 .then
. promise resolve后我就不管了,有什么办法可以让myData
return未resolved的promise而return只是resolved后的结果?
换句话说,myData
可以简单的是解析后的.then
result
吗,还是每次都要写一个新的.then
?
是的,解决 service/factory 中的承诺并在控制器中引用已解决的承诺值,而不是在控制器中引用和处理承诺。希望这是有道理的。
关于使用 promises
首先,您的 myData
服务只能 return 呼叫:
.factory('myData', ['$http', function($http) {
return $http.get('/path/to/endpoint').then(function(req){
return req.data;
});
}]);
展开值
所以你知道如何在 Angular 中使用承诺... 但是,您想要更好的东西,您希望承诺自动用 Angular 的摘要解包。这很棘手,但可以做到。请注意,它可能会使代码混乱,我并不真正推荐它,但这是一般的想法:
自动展开
.factory('myData', ['$http', function($http) {
var result = []; // initial result to return
var p = $http.get('/path/to/endpoint').then(function(res){
result.push.apply(result, res.data); // add all the items
});
result.then = p.then; // allow hooking on it
return result; // return the array, initially empty
}]);
这会让你做类似的事情:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
$scope.data = myData;
}]);
这将在其中放置一个空数组并在实际数据到达时替换它(也会导致摘要),您仍然可以执行 myData.then
以检查它是否已完成加载,以便您可以使用如果您需要确定,请使用旧语法。
这是个好主意吗?
请注意,Angular 在 1.2 版(在 1.3 中完全删除)之前曾这样做过,但由于自动解包被认为太神奇而停止这样做。您可以制定自己的决定,但请注意 Angular 核心团队认为这不是一个好主意。请注意,像 ngResource 这样的东西仍然会这样做。