Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何设置超时以中止工厂或服务中的$http.get()?_Angularjs_Ionic Framework_Ionic_Angularjs Service_Angularjs Factory - Fatal编程技术网

Angularjs 如何设置超时以中止工厂或服务中的$http.get()?

Angularjs 如何设置超时以中止工厂或服务中的$http.get()?,angularjs,ionic-framework,ionic,angularjs-service,angularjs-factory,Angularjs,Ionic Framework,Ionic,Angularjs Service,Angularjs Factory,我在my工厂中有以下方法getData(url),它使用$http.get(url)从url获取数据 angular .module('az-app') .factory('WebServiceFactory', function ($http, $q) { var WebServiceFactory = this; WebServiceFactory.getData = function (url) { var deferred = $q.defer()

我在my工厂中有以下方法
getData(url)
,它使用
$http.get(url)
从url获取数据

angular
  .module('az-app')
  .factory('WebServiceFactory', function ($http, $q) {

   var WebServiceFactory = this;


   WebServiceFactory.getData = function (url) {

      var deferred = $q.defer();

      $http.get(url)
        .then(
        function (response) {

          deferred.resolve({
            data: response
          });

        }, function (rejected) {

          deferred.reject({
            data: rejected
          });
        }
      );
      //Promise to be returned
      return deferred.promise;
    }
它工作正常,但我需要中止http.get和/或拒绝承诺,以便我可以显示来自我的控制器的错误消息,该控制器具有以下方法:

var getSpecialties = function (type) {
  doctorsCtrl.showLoading();

  var url = "example.com";

  WebServiceFactory.getData(url)
    .then(
    function (result) {
      doctorsCtrl.hideLoading();


      var specialtiesArray = result.data.data;

      StorageFactory.specialties = specialtiesArray;
      doctorsCtrl.specialties = StorageFactory.specialties

      //I WANT TO TRIGGER THIS REJECTED FUNCTION when timeout time is finished
    }, function (rejected) {
      doctorsCtrl.hideLoading();
      doctorsCtrl.showAlert();
    }
  );
}

服务
$http
在config对象中接受符合您需要的
timeout
属性。请查看,尤其是关于
config
对象的部分:

超时–{number | Promise}–以毫秒为单位的超时,或在解析时应中止请求的承诺

另外,请注意,您正在以一种低效的方式使用承诺。以下是承诺反模式

你可以简单地:

WebServiceFactory.getData = function (url) {
    return $http.get(url);
}
如果超时时间为3秒,则为:

服务:

WebServiceFactory.getData = function (url) {
    return $http.get(url, {timeout: 3000});  // <-- timeout applies ONLY for this call
}
WebServiceFactory.getData(url).then(
    function (result) {
      doctorsCtrl.hideLoading();
      doctorsCtrl.specialties = StorageFactory.specialties = result.data;
    }, function (rejected) {
      doctorsCtrl.hideLoading();
      doctorsCtrl.showAlert();
    }
  );
还要注意,在成功和出错的情况下,您都在调用
hideLoading
。您可以在链式finally处理程序中调用它一次:


嗨,michael,谢谢你的回答,但我不想在配置中使用它(我熟悉httprovider的方式),因为我希望http.get的超时为10秒,http.post方法的超时为60秒,据我所知,如果我在配置中设置它,那么它是全局的。所以我想用这个http.get来举一个超时的例子,然后我会为http.posit找到它。posit根本不会使它成为全局的,您可以在特定调用的配置对象中将它设置为
$http.get
。我已经用你的代码完成了答案,希望它更清楚。应该解决超时问题,从而触发错误回调。我已经给你做了一个欢迎你的演讲一开始,承诺可能有点难以驾驭,但一旦你明白了你开始喜欢它:)嗨,IMHO解析服务中的数据(比如@Jeka所做的)是一个更好的实践,控制器不需要知道相应响应的包含实际数据的对象子对象。
WebServiceFactory.getData(url).then(
    function (result) {
      doctorsCtrl.hideLoading();
      doctorsCtrl.specialties = StorageFactory.specialties = result.data;
    }, function (rejected) {
      doctorsCtrl.hideLoading();
      doctorsCtrl.showAlert();
    }
  );
// ...
.finally(function () {
    doctorsCtrl.hideLoading();
}