繁体   English   中英

如何模拟angular中的$ http成功?

[英]How can I simulate a $http success in angular?

我在我的应用程序中的多个控制器中使用了一项服务。

该服务包含对PHP脚本的$ http调用,该脚本返回一些重要数据。

我想做的是,如果请求失败,则从用户的localstorage存储中获取该数据,然后在所有控制器中调用绑定到$ http成功的所有函数。

这是我服务的一部分:

app.service('initialJSON', ['$http', function ($http) {
  var vm = this;
  vm.json = $http.get(url);
  vm.json.success(function (data) {
    if (typeof Storage !== "undefined") {
      localStorage.initialJSON = data;
    }
  })
  vm.json.error(function (data, status) {
    if (typeof Storage !== "undefined" && "initialJSON" in localStorage) {
      // call all success functions in all controllers with the locally saved data
    }
  });
}]);

作为示例,应调用此控制器中的函数:

app.controller('someCtrl', ['initialJSON', function(initialJSON) {
  var vm = this;

  initialJSON.json.success(function (data) {
    // This function should be called and do some things with the data
  });

}]);

我不知道这是否可行,或者我必须改变多少结构才能实现,但如果有人有想法,我将非常感激。

与其让控制器重用相同的$ http承诺,不如创建自己的控制器,并在获得结果后将其解析。

app.service('initialJSON', ['$http', '$q', function ($http, $q) {
  var vm = this;
  var deferred = $q.defer();
  vm.json = deferred.promise;

  var request = $http.get(url);
  request.then(function (response) {
    if (typeof Storage !== "undefined") {
      localStorage.initialJSON = response.data;
      deferred.resolve(response.data);
    }
  })
  request.catch(function () {
    if (typeof Storage !== "undefined" && "initialJSON" in localStorage) {
        deferred.resolve(localStorage.initialJSON);
    }
  });
}]);

如果您的控制器只关心成功,那么上面的方法应该起作用。 如果您还需要它们也能够处理错误,则需要在尝试两次获取数据之后以某种方式扩展它以调用deferred.reject()

您可以只使用本地存储和cookie: https : //github.com/grevory/angular-local-storage

或者,如果您正在寻找一些更架构化的内容: https : //github.com/angular-pouchdb/angular-pouchdb

当您说“调用所有成功功能”时,您实际上应该将这些调用包装在一个Promise中。 因此服务可能类似于:

service('myService', ['$q',function($q){
    var _privateServiceCall = function(){
         return myPromiseBasedCall().then(
             function(response){return response;}
         ).catch(function(err){
            throw(err);
         });
    };
    return {
        publicServiceCall = function(){
           var defer = $q.defer();
            _privateServiceCall().then(function(response){
                defer.resolve(response);
            }).catch(function(err){
                throw err;
            })
            return defer.promise;
        }
    }
}]);

当控制器需要服务中的数据时,它将请求该数据,而当准备就绪时,这些承诺将得到解决。

.controller('myController', ['$scope', 'myService', function($scope, myService){
    myService.publicServiceCall().then(function(response){
        console.log(response);
    });
}
}]);

如果您想在按设置的时间表更新数据时设置广播,则可以在服务中使用rootscope广播,并在控制器中使用范围侦听器(scope继承了rootscope,但不会像rootscope侦听器那样导致内存泄漏) 。 但是,您应该尽可能使用Promise模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM