Javascript 对所有被拒绝的本票调用相同的函数

Javascript 对所有被拒绝的本票调用相同的函数,javascript,angularjs,request,Javascript,Angularjs,Request,我想对所有的期票做同样的事情,以防出错。如何重构代码以获得相同的结果,但不需要重复代码 $rootScope.syncing = false; $scope.syncError = true; 我的承诺: Users.updateAuth().then(function(auth) { Interests.syncAll().then(function(interests) { Events.syncAll().then(function(events) {

我想对所有的期票做同样的事情,以防出错。如何重构代码以获得相同的结果,但不需要重复代码

$rootScope.syncing = false;
$scope.syncError = true;
我的承诺:

Users.updateAuth().then(function(auth) {
    Interests.syncAll().then(function(interests) {
        Events.syncAll().then(function(events) {
            $rootScope.syncing = false;
        }, function(error) {
            $rootScope.syncing = false;
            $scope.syncError = true;
        });
    }, function(error) {
        $rootScope.syncing = false;
        $scope.syncError = true;
    });
}, function(error) {
    $rootScope.syncing = false;
    $scope.syncError = true;
});

如果你真的想要,你可以:

function error() {
    $rootScope.syncing = false;
    $scope.syncError = true;
}
然后在这三个地方分别称之为

我很抱歉,如果这是非常明显的,不是你要找的

我不知道还有什么更好的办法


承诺通常有一个“永远”的词,你可以用它来表示你想让事情发生,不管成功或失败,但我认为这不适用于你。

你可以这样做。承诺是可以链接的。你可以在最后一个承诺上使用catch

Users.updateAuth().then((auth)=>{
   //do something with auth here
   return Interests.syncAll()
}).then((interests)=>{
    //do something with interests
    return Users.updateAuth();
}).then((events)=>{
     //do something with events
     $rootScope.syncing = false;
}).catch((err)=>{
     //catch any error here
    $rootScope.syncing = false;
    $scope.syncError = true;
   console.log(err);
});
注意:

我在这段代码中使用了arrow函数。在这种情况下,您可能不知道,它只是绑定匿名函数的一个简短形式。
()=>{}
实际上是
函数(){}.bind(this)只是一个简短的表单。没有绑定的函数(){}在这里可以正常工作,因为我们不使用this引用。

如果在承诺的
然后
回调中返回承诺,则该承诺将用于
然后
链:

Users.updateAuth().then(function(auth) {
  // do something with auth
  return Interests.syncAll();
}).then(function(interests) {
  // do something with interests
  return Events.syncAll();
}).then(
  function success(events) {
    // do something with events
    $rootScope.syncing = false;
  },
  function failure(error) {
    $rootScope.syncing = false;
    $scope.syncError = true;
  }
);

成功了!现在,我试图为每个步骤获取通知消息,但什么也没有发生。看看我是怎么做的,按照你的逻辑:
Users.updateAuth().then(函数(auth){return Interests.syncAll();})。然后(函数(Interests){return Events.syncAll();})。然后(函数(Events){$rootScope.syncing=false;},函数(error){$rootScope.syncing=false;$scope.alerts.push({type:'danger',msg:error});},函数(消息){$rootScope.syncing=message;})
我还添加了deferred.notify,在每次请求之前都会发送一条消息。我收到了,只需使用一个超时函数,notify就会工作;谢谢!