我正在尝试检索数据以用于可在我的整个应用程序中使用的服务。问题是我无法及时获取使用该例程的数据。这是使用它的例程:
function getTranslation(lookup, language) {
var i = 0;
if (vm.translations == null) {
//vm.translations = getAllTranslations();
dataService.getTranslations()
.then(function (data) {
vm.translations = data;
});
}
var len = vm.translations.length;
for (var i=0; i < len; i++) {
if (vm.translations[i].labelName == lookup) {
if (language == "English") {
return vm.translations[i].english;
} else {
if (language == "Spanish") {
return vm.translations[i].espanol;
}
}
}
}
return null;
}
这是该服务中的调用方法:
function getAllTranslations() {
return vm.translations = dataService.getTranslations()
.then(function (data) {
vm.translations = data;
return vm.translations;
});
}
这是dataService中的方法:
function getTranslations() {
return $http.get('/api/labeltext')
.then (getTranslationComplete)
.catch(getTranslationFailed);
function getTranslationComplete(response) {
var deferred = $q.defer();
return response.data;
}
function getTranslationFailed(error) {
alert("XHR failed for frequent pawner report: " + error.responseText);
}
}
我仍在学习angularjs,希望能够填充服务中的数据,然后从其他控制器调用它。但是,当我进入for循环时,该数组为空,并且仅在完成后填充该数组。
最佳答案
那是因为在您的for循环触发之前,诺言将无法解决。通过将循环放在.then()
中,您将可以访问响应并定义循环值。这不是DRY,因为如果将else
添加到该函数中,则会重复代码,并且必须添加相同的循环代码。为此,我将循环重构为外部函数,并仅在getTranslation()
的适当区域内调用它。
function getTranslation(lookup, language) {
var i = 0;
if (vm.translations == null) {
//vm.translations = getAllTranslations();
dataService.getTranslations()
.then(function (data) {
vm.translations = data;
var len = vm.translations.length;
for (var i=0; i < len; i++) {
if (vm.translations[i].labelName == lookup) {
if (language == "English") {
return vm.translations[i].english;
} else {
if (language == "Spanish") {
return vm.translations[i].espanol;
}
}
}
}
});
}
return null;
}