dip*_*rus 4 javascript promise angularjs angular-promise
Angular的新手,可能使用了错误的承诺.我有一个工厂回复承诺:
.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;
}])
Run Code Online (Sandbox Code Playgroud)
现在,如果我在某处注入我的工厂,我可以使用承诺:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
myData.then(function(result) {
$scope.data = result;
});
}]);
Run Code Online (Sandbox Code Playgroud)
这很好,但我开始myData在几个地方使用,我不想.then在我使用数据的每个指令和控制器中写一个新的.在承诺解决后我不再关心它了,有没有办法让它myData返回一个承诺,如果它没有得到解决但只是在它完成解析后返回结果?
换句话说,可以myData简单地解决.then result后,或者我.then每次都要写一个新的?
首先,您的myData服务可以只返回电话:
.factory('myData', ['$http', function($http) {
return $http.get('/path/to/endpoint').then(function(req){
return req.data;
});
}]);
Run Code Online (Sandbox Code Playgroud)
所以你知道如何使用Angular中的promises ...但是,你想要更好的东西,你希望承诺自动解开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
}]);
Run Code Online (Sandbox Code Playgroud)
这可以让你做类似的事情:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
$scope.data = myData;
}]);
Run Code Online (Sandbox Code Playgroud)
这将在那里放置一个空数组,并在真实数据到达时替换它(也导致摘要),你仍然可以做myData.then以检查它是否已经完成加载,这样你就可以使用旧的语法,如果你需要确定的话.
请注意,Angular在 1.2版本(在1.3中完全删除)之前就已经这样做了,但是因为自动展开被认为太神奇了而停止了这样做.您可以制定自己的决定,但请注意Angular核心团队认为这不是一个好主意.请注意,像ngResource这样的东西仍然这样做.
| 归档时间: |
|
| 查看次数: |
3902 次 |
| 最近记录: |