AngularJS中使用service,并同步数据

service是单例对象,在应用中不同代码块之间共享数据。
对一些公用的方法封装到service中,然后通过依赖注入在Controller中调用,示例代码:

1.创建一个模块:

var module = angular.module( "my.new.module", [] );
2.创建一个service服务:

module.service( 'Book', [ '$rootScope', function( $rootScope ) {
      var service = {
      books: [
        { title: "Magician", author: "Raymond E. Feist" },
        { title: "The Hobbit", author: "J.R.R Tolkien" }
      ],

      addBook: function ( book ) {
        service.books.push( book );
        $rootScope.$broadcast( 'books.update' );
      }
   }
   return service;
}]);
3.在Controller中调用:

1 var ctrl = [ '$scope', 'Book', function( scope, Book ) {
2    scope.$on( 'books.update', function( event ) {
3      scope.books = Book.books;
4      scope.$apply();
5    }); 
6    scope.books = Book.books;
7  }];

9  module.controller( "books.list", ctrl );
 

 

但是,当涉及到异步请求的时候,service的数据就可能会在controller调用的时候不同步,比如:

定义一个service,用来请求json数据:

 1 module.service('VService',['$http',function($http){
 2     var service={
 3         getCode:function(mobile){
 4      var msg={}; 
           $http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){
 5               console.log("data=="+JSON.stringify(data));
 6               msg=data;
 7         });
 9         return msg;
10         }
12     }
13 
14     return service;
15 }]);
在controller中调用:

module.controller("myCtrl",["$scope",$routeParams","VService",function($scope,$http,$routeParams,VService){
    $scope.mobile=$routeParams.mobile;
    $scope.getCapt = function(){
            var s=VService.getCode($scope.mobile);
            console.log(s);
    };
}]);    
这时候,控制台打印显示:data有数据,但是s为undefined。

具体原因我没去深究,大概猜测是异步请求数据的原因,因为第二次调用getCapt方法的时候s有数据了,所以通过内置服务$q来进行数据的同步调用:

service这样写:

var service={
        getCode:function(mobile){
            var deferred = $q.defer();//声明延后执行,表示要去监控后面的执行
            $http({method:'get',url:'请求URI',params:{mobile:mobile}}).success(function(data){
                    console.log("data=="+JSON.stringify(data));
                    deferred.resolve(data);//声明执行成功,即http请求数据成功,可以返回数据了
                }
            );
            return deferred.promise;//返回承诺,这里并不是最终数据,而是访问最终数据的API
        }}
controller这样调用:

VService.getCode($scope.mobile).then(function(data){
     $scope.s=data;
     console.log("s==="+JSON.stringify($scope.s));
})
如此实现了数据同步调用。  

 

 

 

使用promise模式:

service代码

1

2

3

4

5

6

7

8

9

10

11

app.service('IndexServ',function($http,$q){

    this.getData = function(){ //暴露一个接口

        //获取数据,并缓存数据

        return $http.get('data/data.json',{cache:true}).then(function (d) {

            this.data = d;

            return $q.when(d);

        }, function (d) {

            return $q.reject(d);

        });

    };

});

controller代码

1

2

3

4

5

app.controller('IndexCtrl',function($scope,IndexServ){

    IndexServ.getData().then(function(res){ //调用获取数据的接口

        $scope.data = res.data;

    });

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值