4

我对 Angular 和承诺仍然很陌生,所以我希望我在这里有正确的想法。

我目前有一个数据层服务,它使用restangular来获取一些数据,然后返回一个承诺,就像这样......

dataStore.getUsers = function (params) {
    return users.getList(params);
};

然后,调用此函数的我的控制器收到一个承诺,就像这样......

$dataStore.getUsers(params).then(function (response) {
    $scope.users = response;
}, function(response) {
    $log.error("Get users returned an error: ", response);
});

这运作良好,但我想在我的数据存储中使用承诺,然后再将其传回。我想使用 .then() 方法检查它是否失败并进行一些日志记录,然后,从成功函数和失败函数中,我想将原始承诺返回给我的控制器。

然后我的控制器就可以像现在一样使用 .then() 方法,事实上,我根本不希望我的控制器代码改变,只是我的数据存储代码。

这是一些半伪代码,用于显示我希望我的数据存储功能执行的操作...

dataStore.getUsers = function (params) {

    users.getList(params).then(function (response) {
        $log("server responded")
        return original promise;
    }, function(response) {
        $log.error("server did not respond");
        return original promise;
    });

};
4

1 回答 1

8

实际上,您的伪代码并不遥远。承诺链:

dataStore.getUsers = function (params) {
    return users.getList(params).then(function (response) {
        $log("server responded")
        return response;
    }, function(failure) {
        $log.error("server did not respond");
        // change to throw if you want Angular lever logs
        return $q.reject(failure); 
    });

};

控制器现在以相同的值被解析/拒绝。日志需要利用 Promise,因此您必须添加一个.then处理程序来处理它。其他 Promise 库为此提供了 convinicene 方法,但 $q 在这方面是极简主义的。

或者,您可以使用更好的 catch 语法,并将错误传播到您的日志:

dataStore.getUsers = function (params) {
    return users.getList(params).then(function (response) {
        $log("server responded")
        return response;
    }).catch(function(failure) {
        $log.error("server did not respond");
        throw failure;
    });

};
于 2014-03-25T17:48:10.850 回答