最佳实践工厂angular.js 1.2

时间:2013-12-27 16:50:31

标签: javascript angularjs

我想使用$ 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;
     }
});

3 个答案:

答案 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