最后在承诺完成之前立即调用

时间:2014-09-04 16:52:47

标签: angularjs angular-promise

我试图在angularjs中履行承诺后执行检查。

request.then(function(res){
    $ionicLoading.hide();
    deferred.resolve(res);
  }, function(res){
    $ionicLoading.hide();
    deferred.reject(res);
  })['finally'](function(res){
      alert(res)
    }
  )

但警报即将来临'未定义'。

  1. 这是预期还是我做错了什么?我认为只有在承诺得到解决/拒绝时才会被召唤。
  2. 实现这一目标的正确方法是什么?
  3. 由于

3 个答案:

答案 0 :(得分:10)

编辑/更新... 这不是最棒的做法,而是一种简单直接的方式。当你沿着承诺链(假设你有多个)时,你需要跟踪你想要最终警告的内容,并将它存储在一个变量中。

var something = null;
request.then(function(response){
    $ionicLoading.hide();
    something = response;
  }, function(reason){
    $ionicLoading.hide();
    something = reason;
  }).finally(function(){ 
      alert(something);
  });

一名示范的人:

http://plnkr.co/edit/DrqeaCAYWTQ4iWY0NPeq?p=preview

答案 1 :(得分:6)

您正在正确执行此操作,问题是传递给finally回调的值与successerror回调返回的值相同。由于您没有返回任何内容,因此值为 undefined

如果将return子句添加到每个回调,它应该起作用:

request.then(function(res){
  $ionicLoading.hide();
  deferred.resolve(res);
  return res;
}, function(res){
  $ionicLoading.hide();
  deferred.reject(res);
  return res;
})['finally'](function(res){
    alert(res)
  }
)

修改

似乎Angular的finally实现还没有准备好将值传递给回调。但是,还有另一种方法可以产生您想要的效果,只需将finally替换为另一种then

request.then(function(res){
  $ionicLoading.hide();
  deferred.resolve(res);
  return res;
}, function(res){
  $ionicLoading.hide();
  deferred.reject(res);
  return res;
}).then(function(res){
    alert(res)
  }
)

由于承诺是按顺序执行的,最后的then将最后运行。由于您未在successerror回调中返回任何其他承诺,因此最后then只需要success回调。

最终你也可以使用这样的东西:

...)['finally'](function(){ }).then(function(res){
    alert(res)
  }
)

答案 2 :(得分:4)

调用finally回调时没有参数。 但是,它确实会返回一个传递结果的承诺。

即使修复了这个问题,你也不会在回调中返回任何内容,因此没有任何内容被传递。 为了说明这一点:

angular.module('myApp', [])
.run( function ($q) {
    var defer = $q.defer();
    defer.promise.then(
        function ( res ) { console.log('s1> '+res); },
        function ( res ) { console.log('e1> '+res); }
    )
    .then(
        function ( res ) { console.log('s2> '+res); },
        function ( res ) { console.log('e2> '+res); }
    )

    defer.reject(1);
});

给出这个:

e1> 1
s2> undefined

请注意,第二个then是成功的"因为拒绝没有被传递。

确保您的回调返回某些内容。如果你想在随后的then中落入errback,请确保你返回拒绝。

var defer = $q.defer();
defer.promise.then(
        function ( res ) { console.log('s1> '+res); return res; },
        function ( res ) { console.log('e1> '+res); return $q.reject(res); }
)
.then(
        function ( res ) { console.log('s2> '+res); return res; },
        function ( res ) { console.log('e2> '+res); return $q.reject(res); }
)

将它们放在一起会产生这样的结果:

var defer = $q.defer();
defer.promise.then(
        function ( res ) { console.log('s1> '+res); return res; },
        function ( res ) { console.log('e1> '+res); return $q.reject(res); }
)
.then(
        function ( res ) { console.log('s2> '+res); return res; },
        function ( res ) { console.log('e2> '+res); return res; }
)
.finally (
        function ( res ) {
            console.log('f0> '+res+','+arguments.length);
        }
)
.then(
        function ( res ) { console.log('s3> '+res); return res; },
        function ( res ) { console.log('e3> '+res); return $q.reject(res); }
)

defer.reject('foo');

导致:

e1> foo
e2> foo
f0> undefined,0
s3> foo

请注意,第二个then中的errback返回了res而不是拒绝,因此调用了finally #s的回调。