如何从异步调用中返回变量

时间:2015-06-23 10:16:34

标签: angularjs asynchronous

我有以下功能:

app.factory('$translation', ['$http', function($http) {

    var getTranslation = function(locale) {
        $http.get("/translations/" + locale + ".json").success(function(data) {
            translations = data;
        });
    };

    getTranslation('en-US');

    var translate = function(input) {
        console.log(translations);
        if(!(input in translations))
            return input;

        var translation = translations[input];
        return translation != null ? translation : input;
    };


    return {
        translate: translate,
        getTranslation: getTranslation
    };

}]);

app.filter('translate', ['$translation', function($translation) {
    return function(input) {
        return $translation.translate(input);
    }
}]);

使用此函数,translation变量在启动时为空,这是有意义的,因为它是异步的。然后,如果我在角度应用程序中导航,我会得到翻译,因为变量不再是空的。

有没有办法,我可以以某种方式使请求同步,或至少模拟同步请求;那么,变量是否存在于翻译函数中?

编辑:复制粘贴错误。现在添加了回报。

1 个答案:

答案 0 :(得分:0)

看起来您的$translate工厂需要返回一个/一些方法函数。

angular.factory('$translation', ['$http', function($http) {

    var translations = {};

    var methods = {
           translate       : translate,
           getTranslation  : getTranslation //Not sure if you wanted this as a private function or not...
    };

    return methods;

    function getTranslation(locale) {
         $http.get("/translations/" + locale + ".json").success(function(data) {
             translations = data;
         });
     };

     getTranslation('en-US');

     function translate(input) {
         console.log(translations);
         if(!(input in translations))
         return input;

         var translation = translations[input];
         return translation != null ? translation : input;
     };
}])

建议: Don't Use $ when naming...well anything not related to the main AngularJS library.