我正在尝试检索数据以用于可在我的整个应用程序中使用的服务。问题是我无法及时获取使用该例程的数据。这是使用它的例程:

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

10-02 20:01