Javascript 美国的承诺工厂
刚接触棱角的人,可能使用的承诺是错误的。我有一家工厂承诺:Javascript 美国的承诺工厂,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,刚接触棱角的人,可能使用的承诺是错误的。我有一家工厂承诺: .factory('myData', ['$http', '$q', function($http, $q) { var deferred = $q.defer(); $http.get('/path/to/endpoint') .success(function(data) { deferred.resolve(data); }) .error(
.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
,我不想写一个新的。然后在每个指令和控制器中使用数据。在承诺得到解决后,我不再关心它了,有没有办法让myData
返回一个承诺,如果它没有得到解决,但只在解决完成后返回结果
换言之,myData
是否可以简单地成为。然后解析后的结果
,还是我必须每次都写一个新的。然后?是,在服务/工厂中解析承诺,并在控制器中引用解析的承诺值,而不是在控制器中引用和处理承诺。希望这是有意义的。关于承诺的工作
首先,您的myData
服务只需返回呼叫即可:
.factory('myData', ['$http', function($http) {
return $http.get('/path/to/endpoint').then(function(req){
return req.data;
});
}]);
展开值
所以你知道如何用承诺来工作。。。
但是,你想要更好的东西,你想要用Angular的消化液自动打开的承诺。这很棘手,但可以做到。请注意,它可能会在代码中造成混乱,我并不推荐使用它,但这里有一个总体思路:
自动展开
这将允许您执行以下操作:
.controller('myController', ['$scope', 'myData', function($scope, myData) {
$scope.data = myData;
}]);
这将在那里放置一个空数组,并在实际数据到达时替换它(也会导致摘要),您仍然可以执行myData。然后检查自己是否加载完毕,以便在需要确定的情况下使用旧语法
这是个好主意吗?
请注意,Angular在1.2版(在1.3版中完全删除)之前一直用于执行此操作,但由于自动展开被认为太神奇,因此停止执行此操作。您可以制定自己的决策,但请注意,Angular core团队认为这不是一个好主意。请注意,ngResource之类的东西仍然可以这样做。您是否有可以返回的默认值,而不是已解析承诺的值?@SteveMitcham当然,在这种情况下,空对象也可以。有点像。我如何只提及承诺的价值而不是承诺本身?
.controller('myController', ['$scope', 'myData', function($scope, myData) {
$scope.data = myData;
}]);