如何处理AngularJS中的工厂服务错误

3

厂商代码

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的操作,但没有得到期望的结果。

2个回答

4

看起来你希望 results 函数接受回调函数,但它的参数列表目前为空。虽然你返回了 Promise,但需要修改该函数。

因此,要么在控制器中更改调用方式为:

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

或者直接更改结果函数本身:

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

谢谢!我尝试了你的第二个选项。但是在控制器中仍然没有错误消息。你想让我在控制器代码中做出一些改变吗? - Watt
请查看$http文档:http://docs.angularjs.org/api/ng.$http。如果您正在使用“success”和“error”回调,则它们接收的参数与“then”回调不同。[数据,状态,标头,配置]。 - satchmorun
虽然这种方式可以工作,但现在我必须将响应的处理逻辑转移到控制器中,而我想保留在工厂中。我希望能够解决它,而不必在控制器中使用.success().error()。在接受您的答案之前,我会等待更多的回复。 - Watt

1

弃用通知 $http遗留的promise方法success和error已被弃用。请改用标准的then方法。如果$httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$http/legacy错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接