используя угловую фабрику с $ http - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно перевести значение фабрики. эта фабрика получает translateData с сервера. и угловой контроллер вызова функции convertValue. но $ http - это асинхронный метод, поэтому контроллер получает неопределенное значение. потому что http ответ еще не получен.

Интересно, что я могу выполнить заводскую инициализацию полностью (= загрузить данные с сервера) и последовательно создать контроллер.

angular.module("app")
.factory("service", function ($http) {
    var allDataMap = {};

    $http({
        method: 'GET',
        url: '/data'
    }).then(function (response) {
        angular.forEach(response.data.datas, function (value) {
            allDataMap[value.key] = value.value;
        });
    });


    return {
        convertValue: function (key) {
            return key + '(' + allDataMap[key] + ')';
        },  
    };
});

1 Ответ

0 голосов
/ 02 ноября 2018

Вы думаете об асинхронном вызове, который будет выполнен синхронно. Этого не произойдет, вам придется подождать, пока вызов ajax не будет выполнен, вы можете легко сделать это, используя обещание.

angular.module("app")
.factory("service", function ($http) {
    var allDataMap = {};
    // create a promise
    var promise = $http({
        method: 'GET',
        url: '/data'
    }).then(function (response) {
        angular.forEach(response.data.datas, function (value) {
            allDataMap[value.key] = value.value;
        });
        return allDataMap;
    });


    return {
        convertValue: function (key) {
            // wait until promise finish 
            return promise.then(function() {
               return key + '(' + allDataMap[key] + ')';
            });
        },  
    };
});
...