角度服务应如何向控制器传达异常?

时间:2013-10-28 09:53:20

标签: angularjs

我有一个服务,它基本上是一些CRUD类型操作的包装器。

app.service('fooService', function ($http) {

    this.getfoo = function(id) {
        return $http.get('api/foo/Get/' + id).then(function (result) {
            return result.data;
        });
    };

    this.getfoos = function () {
        return $http.get('api/foo/Get').then(function (result) {
            return result.data;
        });
    };

    this.createfoo = function(foo) {
        return $http.post('api/foo/Create', foo).then(function(result) {
            return result;
        });
    };

    this.updatefoo = function(id, foo) {
        return $http.put('api/foo/Update/' + foo.id, foo).then(function (result) {
            return result.status;
        });
    };

    this.deletefoo = function(id) {
        return $http.delete('api/foo/Delete/' + id).then(function (result) {
            return result.status;
        });
    };
});

处理异常的最佳方法是什么?有一个很好的单元可测试的方法来做到这一点?我猜测使用此服务的控制器不应该知道它是AJAX调用。这是否意味着我需要一些标准的方式与充当数据存储的服务进行通信?我带回成功指标和消息的一些对象? E.g

var tmp = {
    success: false,
    error: 13,
    message: 'This foo already exists'
}

2 个答案:

答案 0 :(得分:0)

$http.delete('api/foo/Get/' + id)返回promise,因此我们可以使用错误处理程序,如:

app.service('fooService', function ($http) {

 var tmp = {
           success: false,
           error: -1,
           message: ''
           }

    this.getfoo = function(id) {
        return $http.get('api/foo/Get/' + id).then(function (result) {
            return result.data;
        }, function (result) {
            tmp.message = "blablblab";
            tmp.error = result.status;
            return tmp;
        });
    };
    ....
});

演示 Fiddle

答案 1 :(得分:0)

首先,您的服务方法可以返回promise对象。由于承诺会被解决成功或失败,因此您可以知道何时完成操作以及何时失败。记住承诺可用于任何异步性质的调用。它们不仅仅与AJAX调用绑定。

作为第一步,您的服务方法应该在使用$ http服务时直接返回承诺。

 this.getfoo = function(id) {
        return $http.get('api/foo/Get/' + id);
    };

在您的情况下,您将返回then函数返回值。正如文档中提到的那样

  

此方法返回通过解析或拒绝的新承诺   successCallback的返回值,errorCallback。它也是   通过notifyCallback方法的返回值进行通知。该   promise无法从notifyCallback中解析或拒绝   方法

您正在抑制从服务器获得的错误,因为您没有添加错误回调函数。做得更好return $http.get(...)。这样您就可以在控制器或任何其他地方处理成功和错误情况,例如

如果您想将错误包装到特定对象中,您可以在服务中创建自己的承诺,并在承诺拒绝时返回自定义。