Javascript 无法获取嵌套承诺有效的$q.all-等待全部
我完全理解以前也有人问过类似的问题,但我没有让它运行。我需要一连串的承诺,我需要等到所有的承诺都得到解决 我的问题是,我需要根据另一个承诺的结果做出不同的承诺:-( 因此,根据promise2的结果,我的promise4是或者是$translate.use或者它是$translate.refresh 这是我到目前为止所做的(简化):Javascript 无法获取嵌套承诺有效的$q.all-等待全部,javascript,angularjs,q,Javascript,Angularjs,Q,我完全理解以前也有人问过类似的问题,但我没有让它运行。我需要一连串的承诺,我需要等到所有的承诺都得到解决 我的问题是,我需要根据另一个承诺的结果做出不同的承诺:-( 因此,根据promise2的结果,我的promise4是或者是$translate.use或者它是$translate.refresh 这是我到目前为止所做的(简化): var promise1=someService.get({})。$promise.then(函数(结果){ //做事 }); var promise2=ano
var promise1=someService.get({})。$promise.then(函数(结果){
//做事
});
var promise2=anotherService.getPromise().then(函数(结果){
var属性=结果[0];
//做事
归还财产;
});
var promise3=promise2.then(函数(属性){
//这里使用$translate(角度平移),它也是异步的
var userLanguage=properties.language;
if(userLanguage!=$translate.preferredLanguage()){
//要么这是第四个承诺
$translate.use(用户语言).then(函数(myVar){
// ...
});
}否则{
//或者这是第四个承诺
$translate.refresh().then(函数(myVar){
// ...
});
}
});
var loadPromissions={
允诺人1:允诺人1
允诺人2:允诺人2
允诺人3:允诺人3
承诺4:???
};
$q.all(loadPromises).然后(函数(结果){
//做了什么
})
你真的不需要监控promise3
和promise4
,你所需要的只是promise1
和promise2
,promise3
成为promise2
的下一步。只要注意你如何回报新的承诺(从promise2
返回$translate。使用或返回$translate。刷新
),然后部分:
var promise1 = someService.get({}).$promise.then(function(result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function(result) {
var properties = result[0];
// do stuff
return properties;
})
.then(function(properties) {
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
return $translate.use(userLanguage).then(function(myVar) {
// ...
});
} else {
// or this is the 4th promise
return $translate.refresh().then(function(myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2
};
$q.all(loadPromises).then(function(result) {
// anything done
});
如果我对你的代码理解得足够透彻,我认为你只需要返回promise3
中的内在承诺。在你的例子中,promise1
和promise2
在服务完成之前都不会得到解决。因为promise3
依赖于promise2
它在promise2
之前不会完成已解决。我相信$q.all
会一直持续下去,直到所有承诺都完成,甚至承诺返回的承诺。由于promise3
返回承诺,promise3
在内部承诺得到解决之前不会被视为已解决。因此,我认为添加两个return
语句就是您所需要的:
var promise1 = someService.get({}).$promise.then(function (result) {
// do stuff
});
var promise2 = anotherService.getPromise().then(function (result) {
var properties = result[0];
// do stuff
return properties;
});
var promise3 = promise2.then(function(properties){
// using $translate (angular-translate) here which is async as well
var userLanguage = properties.language;
if (userLanguage !== $translate.preferredLanguage()) {
// either this is the 4th promise
//NOTE: added return here
return $translate.use(userLanguage).then(function (myVar) {
// ...
});
} else {
// or this is the 4th promise
//NOTE: added return here
return $translate.refresh().then(function (myVar) {
// ...
});
}
});
var loadPromises = {
promise1: promise1,
promise2: promise2,
promise3: promise3
};
$q.all(loadPromises).then(function (result) {
// anything done
});
这与OP中的逻辑不完全相同。promise3
确实被破坏了,return
语句丢失了,但是promise2
很好,可以按原样保存。这将使“所有人”都可以访问该承诺的结果promise,如OP.@Amit中所述,我的代码在$q.all块中不会有promise2结果,但我的理解是OP并不真正需要它,否则他们可能会(?)不是将promise3链接到它。但是当然你是正确的,如果需要,那么它仍然很容易调整。如果需要,为什么要使用最后一个然后处理程序?代码只是从前一个函数继续到后一个函数,没有返回语句和额外的承诺链。