Angularjs получает значения объекта вне функции

0

Мне нужно получить значение localeData, чтобы распечатать часть функции ниже. Я знаю, как печатать в стороне от функции, как то, что я сделал здесь. Я пробовал это, но не работал.

    $http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
        console.log(localeData);
        }).error(function(err) {
            alert('warning', err.message);
        });
        //need to get that value here.
        console.log(localeData);

РЕДАКТИРОВАТЬ

На самом деле мне нужно сделать это

app.factory('customLoader', function($http, $q, SERVER_URL) {

    return function(options) {
        var deferred = $q.defer();

        // do something with $http, $q and key to load localization files
        $http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
         //do something here to localData
        }).error(function(err) {
            alert('warning', err.message);
        });

        deferred.resolve(localeData);
        return deferred.promise;

    };
});

Это то, что мне нужно. наконец, мне нужно отправить localeData.

  • 0
    Вы должны назначить этот вывод объекту / переменной контроллера
  • 0
    Есть идеи как это сделать ??
Показать ещё 4 комментария
Теги:

5 ответов

0
Лучший ответ

Вам не нужно $ q для достижения вашей цели:

app.factory('customLoader', ["$http", "SERVER_URL", function($http, SERVER_URL) {
    return function(options) {
        return $http.post(SERVER_URL + 'getLocaleData');
    };
}]);

Потому что $http и все его удобные методы действительно возвращают обещание. В этом случае вы можете использовать эту услугу следующим образом:

customLoader(options).success(function(localeData){
    //do something here to localData
}).error(function(err){
    alert('warning', err.message);
});

Если вы действительно должны использовать $q, то это должно сделать:

app.factory('customLoader', ["$http", "$q", "SERVER_URL", function($http, $q, SERVER_URL) {
    return function(options) {
        return $q(function(resolve, reject){
            $http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
                //do something here to localData
                resolve(localeData); // ultimately you ought to resolve inside this function
            }).error(function(err) {
                alert('warning', err.message);
                reject(localeData); // ultimately you ought to reject inside this function
            });
        });
    };
}]);
  • 0
    Я получил ошибку ниже. TypeError: $ q не является функцией возврата $ q (функция (разрешить, отклонить) {
  • 0
    ОК, это очень маловероятно. Как вы используете этот сервис? Тем временем я сделал очень незначительное обновление предоставленного образца.
Показать ещё 9 комментариев
1

Вам не нужно создавать и разрешать отсрочку самостоятельно. Есть более простой способ. (Также в примере, который вы даете, вы разрешаете обещание до завершения базового ajax)

Услуга Angular.js $http соответствует интерфейсу $q ! Поэтому вы можете написать:

app.factory('customLoader', function($http, $q, SERVER_URL) {
  return function(options) {
    var promise = $http.post(SERVER_URL + 'getLocaleData')
      .then(function(localeDataBag) {
         var localeData = localeDataBag.data; // .data of 'then' equals to what .success returns.            
         modifiedLocaleData = localeData++;  // do something here to localData
         return modifiedLocaleData; // This is the new result
        })
      .catch(function(err) {
        console.log(err);
        return $q.reject(err); // This is the new result if something failed. Since we are chaining promises, we should keep failure state.
      });
    return promise;
  };
});
0

Следующим способом вы можете получить доступ к ответу своего сервера за пределами фабрики в контроллере:

app.factory('customLoader', function ($http, $q) {
        return {
            response: {},
            getLocalData: function (param) {
                var deferred = $q.defer();
                $http.post(SERVER_URL + 'getLocaleData', param).
                    success(function (data, status, headers, config) {
                        deferred.resolve(data);
                    }).
                    error(function (data, status, headers, config) {

                    });

                return deferred.promise;
            }
        }
    });


 app.controller('yourCtrl', function($scope,customLoader) {

       $scope.GetLocaleData= function() {    
                customLoader.getLocalData({
                    Role: role,
                    Email_Id: $scope.Email,
                    Pwd: $scope.Password
                }).then(function(localeData) {
                    $scope.Data = localeData;                        
                });        
        }
 }); 
0

JS является асинхронным, что в основном означает, что ваш последний console.log будет выполнен до того, как ваш сервер вернет любые данные. Поэтому вы должны сделать это в своих обещаниях:

$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
    console.log(localeData);
    }).error(function(err) {
         console.log(err);
        alert('warning', err.message); //Just in case you didn't know, this line supposes that your server returns a JSON object with a "message"-property

    });

Таким образом, ваш сервер-ответ будет console.log с успехом и неудачей.

Справка

Изменение: Если вы действительно хотите сделать это по-другому:

var response; //First, declare a variable in the parent scope.

$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
    response = localeData; //Assign the response data to the variable.
    console.log(localeData);
    }).error(function(err) {
        alert('warning', err.message); //Just in case you didn't know, this line supposes that your server returns a JSON object with a "message"-property

    });
    console.log(response);

Однако пример не будет оцениваться, как вы ожидаете. Последний console.log будет просто зарегистрировать undefined.

  • 0
    Вы также можете использовать сервис q .
  • 0
    Я знаю, как сделать это в сторону функции.
Показать ещё 1 комментарий
0

localeData ограничена областью функции .success. Вы не можете получить его снаружи, если вы не назначили ему какую-то другую переменную.

var data = ""
$http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
    data = localeData;
    }).error(function(err) {
        alert('warning', err.message);
    });
//need to get that value here.
console.log(data);

Но не ожидайте получить желаемое значение в data пока не получите ответ. $http.post - асинхронный

Взгляните на обещания преодолеть такие проблемы, потому что они используются повсюду в угловом мире.

ОБНОВИТЬ:

Как вы это сделали в редактировании, вы можете использовать службу $ q, например:

app.factory('customLoader', function($http, $q, SERVER_URL) {

    return function(options) {
        var deferred = $q.defer();

        // do something with $http, $q and key to load localization files
        $http.post(SERVER_URL + 'getLocaleData').success(function(localeData) {
         //do something here to localData
        }).error(function(err) {
            alert('warning', err.message);
        });

        deferred.resolve(localeData);
        return deferred.promise;

    };
});

ИЛИ, вы можете просто вернуть $http.post который сам возвращает обещание

app.factory('customLoader', function($http, $q, SERVER_URL) {
    return function(options) {        
        return $http.post(SERVER_URL + 'getLocaleData');
    };
});

В любом случае вы возвращаете объект обещания, а не только фактический ответ, который вы получаете от сервера. localeData можно получить следующим образом:

customLoader().success(function(res){
   console.log(res);
 }).error(function(){
    //show some error message
 })

Ещё вопросы

Сообщество Overcoder
Наверх
Меню