Javascript 无法获取嵌套承诺有效的$q.all-等待全部

Javascript 无法获取嵌套承诺有效的$q.all-等待全部,javascript,angularjs,q,Javascript,Angularjs,Q,我完全理解以前也有人问过类似的问题,但我没有让它运行。我需要一连串的承诺,我需要等到所有的承诺都得到解决 我的问题是,我需要根据另一个承诺的结果做出不同的承诺:-( 因此,根据promise2的结果,我的promise4是或者是$translate.use或者它是$translate.refresh 这是我到目前为止所做的(简化): var promise1=someService.get({})。$promise.then(函数(结果){ //做事 }); var promise2=ano

我完全理解以前也有人问过类似的问题,但我没有让它运行。我需要一连串的承诺,我需要等到所有的承诺都得到解决

我的问题是,我需要根据另一个承诺的结果做出不同的承诺:-(

因此,根据promise2的结果,我的promise4或者是$translate.use或者它是$translate.refresh

这是我到目前为止所做的(简化):


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链接到它。但是当然你是正确的,如果需要,那么它仍然很容易调整。如果需要,为什么要使用最后一个
然后
处理程序?代码只是从前一个函数继续到后一个函数,没有返回语句和额外的承诺链。