如何调用角度工厂接连完成?

时间:2014-12-22 13:27:41

标签: angularjs

如何在第一个工厂http呼叫结束后调用另一个角度工厂?

第一家工厂:

app.factory('personService', function ($http,$rootScope) {    
  return {
    getPerson: function () {
      //return the promise directly.
      return $http.get('http://localhost:8080/emobile/api/rest/confperson/1/1').then(function (result) {
        //resolve the promise as the data
        $rootScope.userLanguage = result.data.person.languageAbbrevation;
        return result.data;
      });
    }
  }
});

首先需要调用的第二个工厂完成:

app.factory('TranslateData', function ($http,$rootScope) {

  return {
    getTranslation: function () {
      //return the promise directly.
      return $http.get('http://localhost:8080/emobile/api/rest/gettranslations/1/1/' + $rootScope.userLanguage).then(function (result) {
        //resolve the promise as the data
        return result.data;
      });
    }
  }
});

2 个答案:

答案 0 :(得分:2)

您正在从这两种方法中正确返回一个承诺(这是$http的结果)。你现在需要做的就是将它们联系起来。

personService.getPerson()
  .then(function(personResult){
     return TranslateData.getTranslation();
  })
  .then(function(translationResult){
     // do something after translation
  });

这是一个plunker $timeout(也会返回一个承诺)来说明。

这是关于链接承诺的$q的{​​{3}},以及documentation - Angular的$q受到启发。

答案 1 :(得分:0)

你所追求的通常被称为“链接承诺”。

我通常不建议这样做,因为这会导致代码:

  • 很难维护(你将两个服务结合在一起)
  • 效率不高 - 您可以并行运行这些调用,从而更快地从服务器获取结果
  • 看起来很难看: - )

根据我的经验,通常最好和最有效的方法是在服务器上准备所有需要的数据(因此有一个HTTP调用而不是两个)。 如果那是不可能的,那么我更愿意创建一个服务,将承诺缓存到gettranslations资源,并在适当的时候支持。

很难在不查看完整代码的情况下告诉您更多信息,但这是我的第一印象。但是,如果您真的想这样做,那么您可以随时致电:

personService.getPerson().success(funciton() {

  // When first call finished, then start the 2nd one

  TranslateData.getTranslation().success(function(){

     // Both calls have finished at this point.

  });

});