如何在第一个工厂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;
});
}
}
});
答案 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.
});
});