我想使用$ http和angular.js创建服务,如this plunk
所示但是当我尝试在角度1.2中进行操作时,我在工厂中不能有多个功能,就像这里所做的那样
适用角度1.0.2
app.factory('myService', function($http, $q) {
return {
getFoo: function() {
var deferred = $q.defer();
$http.get('foo.json').success(function(data) {
deferred.resolve(data);
}).error(function(){
deferred.reject();
});
return deferred.promise;
},
getBar: function(callback) {
$http.get('foo.json').success(callback);
},
testHttpGetResult: function (){
return $http.get('foo.json');
}
}
});
我应该如何在角度1.2中做到这一点?我必须使用不同的方法(不是工厂)吗?
提前致谢。
被修改
它有效,因为只有一个函数(getFoo)
app.factory('myService', function($http, $q) {
return {
getFoo: function() {
var deferred = $q.defer();
$http.get('foo.json').success(function(data) {
deferred.resolve(data);
}).error(function(){
deferred.reject();
});
return deferred.promise;
}
});
答案 0 :(得分:3)
从Angular 1.2开始,promise unwrapping is optional,它将在Angular的未来版本中完全禁用。
换句话说,您的干净版本从1.2开始需要选择加入,并且将来根本无法使用。
答案 1 :(得分:2)
我猜想如果你看一下你已定义“getFoo”的代码如下:
getFoo: function() {
// ... code here ...
return deferred.promise;
},
当您调用此例程时,请使用以下代码:
// "foo" represents a PROMISE, not the actual json value!
$scope.foo = myService.getFoo();
例程不返回您期望的值 - 而是返回一个promise,这就是范围没有您期望的原因。您需要使用“.then”语法来实际获取例程中的数据结果。由于某些原因,似乎旧版本的角度可能已经为你做了(可能)?
无论如何,问题不在于您是否可以定义多个例程(您可以),而是如何调用这些例程。
修改强>
如果我没有说清楚,标记为“干净方式”的调用方法不应该(并且不起作用)。您应该使用以下代码:
// The clean way - FIXED
myService.getFoo().then(function (data){
$scope.foo = data;
});
祝你好运!
答案 2 :(得分:1)
我知道这是一篇很老的帖子,但我发现这篇文章给了我很多帮助。 希望这会有助于他人。它休闲了drew_w的答案。
http://blog.brunoscopelliti.com/angularjs-promise-or-dealing-with-asynchronous-requests-in-angularjs
这个更好: 在所有承诺得到解决后才显示路线 http://blog.brunoscopelliti.com/show-route-only-after-all-promises-are-resolved