【问题标题】:How to handle factory service errors in AngularJS如何处理 AngularJS 中的工厂服务错误
【发布时间】:2013-06-06 22:29:13
【问题描述】:

工厂代码

app.factory('abcFactory', function ($http, Config, $log) {
    var serviceURL = Config.baseURL + '/results';
    return{
        results:function() {
            var promise = $http({
                method: 'GET',
                url: serviceURL,
                timeout: Config.httpTimeout
            }).then(function(response) {
                    return response;  

                },  function(reason) {
                    $log.error("Request Failed: ", reason)
                });

            return promise;
        }
    }
});

控制器代码

app.controller('abcController',function ($scope, $log,abcFactory, Config)
{

        abcFactory.results(function(data){
            $scope.results =data;
        },function(response)
        {
          console.log("response"+response);

          if(response.status === 0)
          {
              console.log("gotcha");
               $scope.serviceTimedoutError(response.data, response.status, response.config);
          } else
          {
                console.log("gotcha");
                $scope.serviceFailure(response.data, response.status, response.config);
          }


        });
});

$scope.results 会在服务返回良好响应时正常填充。

而且,当出现错误时,我可以在控制台上看到来自工厂代码日志的错误消息"Request Failed: blah blah "

我的问题: 当出现错误时,为什么我在控制器中没有看到错误消息,它甚至没有在浏览器控制台中打印"gotcha"。我需要控制器中的错误详细信息,以便我可以在视图中显示它。我不想在工厂传递$scope

我在控制器代码中做错了什么?

如果我没记错的话,我正在按照AngularJS Failed Resource GET 做一些事情 但没有得到想要的结果。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您似乎希望results 函数接受回调,但它的参数列表当前为空。不过,您正在返回承诺。

    所以要么将控制器中的调用更改为:

    abcFactory.results()
      .success(function() { ... })
      .error(function() { ... })
    

    或者改变结果函数本身:

    results: function(successCallback, errorCallback) {
      var promise = $http(...).success(successCallback).error(errorCallback);
      return promise;
    }
    

    【讨论】:

    • 谢谢!我试过你的第二个选项。我仍然没有在控制器中收到错误消息。您是否也希望我更改控制器代码中的某些内容?
    • 查看 $http 文档:docs.angularjs.org/api/ng.$http。如果您使用successerror 回调,它们接收的参数与then 的回调不同。 [数据、状态、标题、配置]。
    • +1.. 虽然这样可以。但是现在,我必须将响应的处理逻辑转移到我想保留在工厂中的控制器上。我想解决它而不必在控制器中使用.success().error()。在接受您的回答之前,我将等待更多的回复。
    【解决方案2】:

    弃用通知 $http 遗留承诺方法成功和错误已被弃用。请改用标准 then 方法。如果 $httpProvider.useLegacyPromiseExtensions 设置为 false,那么这些方法将抛出 $http/legacy 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2013-04-20
      • 2015-11-25
      • 2023-03-08
      • 2023-04-06
      相关资源
      最近更新 更多