Javascript Angularjs承诺不会及时解决

Javascript Angularjs承诺不会及时解决,javascript,angularjs,promise,angularjs-service,Javascript,Angularjs,Promise,Angularjs Service,我正在尝试检索数据,以便在可以在整个应用程序中使用的服务中使用。问题是,我无法为使用数据的例程及时解决数据。下面是使用它的例程: function getTranslation(lookup, language) { var i = 0; if (vm.translations == null) { //vm.translations = getAllTranslations();

我正在尝试检索数据,以便在可以在整个应用程序中使用的服务中使用。问题是,我无法为使用数据的例程及时解决数据。下面是使用它的例程:

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 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()
中,您将可以访问响应并定义循环值。这不是干的,因为如果向函数添加
else
,则会有代码重复,并且必须添加相同的循环代码。为此,我将把循环重构为一个外部函数,并从
getTranslation()
的适当区域调用它

函数获取翻译(查找,语言){
var i=0;
if(vm.translations==null){
//vm.translations=getAllTranslations();
dataService.getTranslations()
.then(功能(数据){
vm.translations=数据;
var len=vm.translations.length;
对于(变量i=0;i
由于您的数据源于承诺(
$http
),因此需要访问该数据的所有后续代码必须位于
then
函数中

angular.controller('myController', function(dataService) {
    var translationsPromise;

    /**
     * Caches translations from /api/labeltext and performs a lookup
     * @param lookup
     * @param language
     */
    function getTranslation(lookup, language) {

        if (translationsPromise == null) {
            translationsPromise = dataService.getTranslations()
        }

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



    getTranslation('Some Label', 'English').then(function(translation) {
        // The translation that was found is accessible in this block
    });

});
angular.controller('myController',函数(数据服务){
var转换承诺;
/**
*缓存/api/labeltext中的翻译并执行查找
*@param查找
*@param语言
*/
函数getTranslation(查找,语言){
if(translationPromission==null){
TranslationPromise=dataService.getTranslations()
}
translationsPromise.then(函数(数据){
vm.translations=数据;
var len=vm.translations.length;
对于(变量i=0;i
当数据是异步派生的时,最好缓存承诺而不是数据。因此,如果在解析原始承诺之前对相同数据发出另一个请求,则可以从缓存中检索该承诺,并返回或以其他方式利用该承诺。缓存的异步数据情况并非如此,不能保证在发出另一个请求时已到达

function getTranslation(lookup, language) {
    if (!vm.translationsPromise) {
        vm.translationsPromise = dataService.getTranslations();
    }
    return vm.translationsPromise.then(function (data) {
        var lang = {'English':'english', 'Spanish':'espanol'};
        return data.reduce(function(str, item) {
            return (str !== '') ? str : (item.labelName == lookup) ? item[lang[language]] : str;
        }, '');
    });
}

什么代码正在调用
getTranslation()
?如果API正在返回异步数据,那么它需要在整个应用程序中保持异步。换句话说,您始终需要使用
。然后
来获取数据。或者,查看
ui.router
/
ngRoute
路由器-它们支持
resolve
参数,该参数基本上等待加载数据已加载下的状态/路由
angular.controller('myController', function(dataService) {
    var translationsPromise;

    /**
     * Caches translations from /api/labeltext and performs a lookup
     * @param lookup
     * @param language
     */
    function getTranslation(lookup, language) {

        if (translationsPromise == null) {
            translationsPromise = dataService.getTranslations()
        }

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



    getTranslation('Some Label', 'English').then(function(translation) {
        // The translation that was found is accessible in this block
    });

});
function getTranslation(lookup, language) {
    if (!vm.translationsPromise) {
        vm.translationsPromise = dataService.getTranslations();
    }
    return vm.translationsPromise.then(function (data) {
        var lang = {'English':'english', 'Spanish':'espanol'};
        return data.reduce(function(str, item) {
            return (str !== '') ? str : (item.labelName == lookup) ? item[lang[language]] : str;
        }, '');
    });
}