AngularJS:承诺,你可以在使用.then()之后传回一个承诺吗?

时间:2014-03-25 17:41:24

标签: javascript angularjs promise restangular angular-promise

我还是Angular的新手并承诺所以我希望我在这里有正确的想法。

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

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);
});

这很好用,但我想在传回数据存储之前使用我的数据存储区内的promise。我想使用.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;
    });

};

1 个答案:

答案 0 :(得分: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处理程序才能处理它。其他承诺库对此有着可靠的方法,但在这方面,$ 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;
    });

};