1

我有一项服务,它基本上是一些 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 调用。这是否意味着我需要一些标准的方式来与充当数据存储的服务进行通信?我返回的带有成功指示器和消息的对象?例如

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

2 回答 2

0

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

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

于 2013-10-28T10:15:36.710 回答
0

从您的服务方法开始可以返回承诺对象。由于 promise 被解析为成功或失败,因此您将知道操作何时完成以及何时失败。请记住,promise 可以用于任何异步性质的调用。它们不仅仅与 AJAX 调用相关联。

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

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

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

此方法返回一个新的 Promise,该 Promise 通过 successCallback 的返回值 errorCallback 解决或拒绝。它还通过 notifyCallback 方法的返回值进行通知。无法从 notifyCallback 方法解决或拒绝承诺。

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

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

于 2013-10-28T10:55:13.020 回答