Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:promises,你能在使用.then()后将承诺传递回去吗?_Javascript_Angularjs_Promise_Restangular_Angular Promise - Fatal编程技术网

Javascript AngularJS:promises,你能在使用.then()后将承诺传递回去吗?

Javascript AngularJS:promises,你能在使用.then()后将承诺传递回去吗?,javascript,angularjs,promise,restangular,angular-promise,Javascript,Angularjs,Promise,Restangular,Angular Promise,我还是一个新的角度和承诺,所以我希望我有正确的想法在这里 我目前有一个数据层服务,它使用restanglar获取一些数据,然后返回一个承诺,如下所示 dataStore.getUsers = function (params) { return users.getList(params); }; $dataStore.getUsers(params).then(function (response) { $scope.users = response; }, function(

我还是一个新的角度和承诺,所以我希望我有正确的想法在这里

我目前有一个数据层服务,它使用restanglar获取一些数据,然后返回一个承诺,如下所示

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);
});
然后,我的控制器调用了这个函数,收到了一个回复,就像这样

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()方法检查它是否失败,并做一些日志记录,然后,从suces函数和failure函数中,我想将原始承诺返回给我的控制器

然后,我的控制器就可以像现在一样使用.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;
    });

};

实际上,在伪代码中,您一点也不遥远。承诺链:

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,因此必须添加
。然后添加
处理程序来处理它。其他promise库对此有方便的方法,但$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;
    });

};

如果必须返回原始承诺,那么还可以执行
var p=users.getList(…);p、 然后(…日志代码…);返回p
,但没有好的理由选择它。在
之前缺少一个括号。catch
@thefourye这正是编辑的目的:p请随意编辑我的代码,以便下次修复此类问题:)实际上,如果您在5分钟内编辑,那么不必维护编辑历史:)谢谢Benjamin,这正是我想要的。我缺少的一点是你可以把整件东西还给我。我将使用第二个版本,尽管我不知道角度捕捉的作用。我相信稍后会明白为什么这是个好主意:)