无法通过嵌套承诺获得 $q.all - 等待所有

Cannot get $q.all with nested promises working - wait for all

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

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

所以根据 promise2 我的 promise4 的结果是 EITHER $translate.use $translate.refresh

这是我目前所拥有的(已简化):

      
      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
          $translate.use(userLanguage).then(function (myVar) {
            // ...
          });
        } else {
          // or this is the 4th promise
          $translate.refresh().then(function (myVar) {
            // ...
          });
        }
      });

      var loadPromises = {
        promise1: promise1
        promise2: promise2
        promise3: promise3
        promise4: ???
      };

      $q.all(loadPromises).then(function (result) {
        // anything done
      });

你不需要监控promise3promise4,你只需要监控promise1promise2promise3 成为 promise2 的下一步。请注意您如何从 promise2 然后 return 新承诺(return $translate.usereturn $translate.refresh)然后部分 :

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
});

如果我足够理解你的代码,我认为你只需要 return promise3 里面的 inner promise。在您的示例中, promise1promise2 在服务完成之前不会被解析。由于 promise3 依赖于 promise2 它不会完成直到 promise2 解决。我相信 $q.all 会一直持续下去,直到所有承诺都完成,甚至 return 由承诺完成。由于 promise3 return 是一个承诺,在解决内部承诺之前,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
  });