如何忽略来自$ http GET请求的错误消息?

时间:2016-09-26 17:00:18

标签: javascript angularjs http

我有一个函数可以查看我的数据库是否有特定的链接。我不确定是否有可能做到这一点,或者我是否做错了。我正在使用Angular HTTP GET请求,如果找到该对象,我会尝试返回它。这就是我所拥有的:

var foo = function(list, value) {
  for(var i = 0; i < list.length; i++) {
    $http.get(list[i]).then(function(object) {
        var dbObject = object.data;
        if(contains(dbObject, value) {
            return list[i];
          }
        });
    }
  }
};

所以,我希望返回链接到包含该值的JSON对象的有效URL。有一个更好的方法吗?现在,它在进程完成之前抛出一个Not Found Error,我希望找到一种方法来忽略停止我的程序的错误。

2 个答案:

答案 0 :(得分:0)

我认为,这里的逻辑存在一些缺陷,$ http.get()会返回一个promise。如果您收到http错误,它将无法解决。为了利用错误处理,您实际上必须传递一个错误处理函数,该函数将在promise promise中被调用。

 $http.get(list[i]).then( success_handler, error_handler );

另外,正如Thomas在评论中提到的那样,你可能没有正确使用它。您的方法将启动所有get请求并返回。这些get请求的结果将在稍后发生,并且每个结果都将成功执行成功或错误处理程序。

答案 1 :(得分:0)

您可以创建一个promises数组,然后使用$q.all方法返回并测试所有结果。

(function (ng) {
  'use strict';
  
  ng.module('HttpDemo')
    .factory('LinkChecker', LinkChecker)
    .controller('LinkCheckerDemoController', LinkCheckerDemoController);
  
  function LinkChecker ($q, $http) {
    function LinkCheckerFunc (links, value) {
      return $q(function (resolve, reject) {
        var linkPromises = [];
      
        ng.forEach(links, function (link) {
          linkPromises.push($http.get(link));
        });
        
        $q.all(linkPromises)
          .then(_onGetLinksSuccess, reject);

        function _onGetLinksSuccess (responses) {
          var validLinks = [];

          ng.forEach(responses, function (linkToCheck) {
            var link = linkToCheck.data;

            if (contains(link, value) {
              validLinks.push(link);
            }
          });

          resolve(validLinks);
        }
      });
    }
    
    return (LinkCheckerFunc);
  }

  function LinkCheckerDemoController (LinkChecker, $log) {
    var linkCheckerDemoVM = this;

    linkCheckerDemoVM.checkLinks = checkLinks;

    // example usage
    function checkLinks () {
      var validLinks = new LinkChecker(
        linkCheckerDemoVM.links,
        linkCheckerDemoVM.value
      );

      validLinks.then(_onGetValidLinksSuccess, _onGetValidLinksError);

      function _onGetValidLinksSuccess (links) {
        $log.info('Valid Links', link);
      }

      function _onGetValidLinksError (err) {
        $log.error(err);
      }
    }
  }
})(angular);