我试图在angularjs中履行承诺后执行检查。
request.then(function(res){
$ionicLoading.hide();
deferred.resolve(res);
}, function(res){
$ionicLoading.hide();
deferred.reject(res);
})['finally'](function(res){
alert(res)
}
)
但警报即将来临'未定义'。
由于
答案 0 :(得分:10)
编辑/更新... 这不是最棒的做法,而是一种简单直接的方式。当你沿着承诺链(假设你有多个)时,你需要跟踪你想要最终警告的内容,并将它存储在一个变量中。
var something = null;
request.then(function(response){
$ionicLoading.hide();
something = response;
}, function(reason){
$ionicLoading.hide();
something = reason;
}).finally(function(){
alert(something);
});
一名示范的人:
答案 1 :(得分:6)
您正在正确执行此操作,问题是传递给finally
回调的值与success
或error
回调返回的值相同。由于您没有返回任何内容,因此值为 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
将最后运行。由于您未在success
和error
回调中返回任何其他承诺,因此最后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的回调。