AngularJS: Как синхронизировать HTTP-вызов с переменной?

0

Я пытаюсь сделать общую функцию внутри контроллера, который дает мне данные из бэкэнд и присваивает эти данные переменной.

Я сделал этот код, но он работает неправильно.

self.getData = function(url){
    var deferred = $q.defer();

    $http.get(url)
    .success(function(data){
        deferred.resolve(data);
        console.log("Total profiles: " + data.data.length);         
    })
    .error(function(error){
        //do something
    });

    return deferred.promise;
};

$scope.data = self.getData(ServiceURL.url[7]);
console.log("Total profiles inside function: " + $scope.data.length);

Вызов функции работает нормально и дает общее количество профилей правильно, но когда я пытаюсь присвоить эти данные $ scope.data, это не работает нормально, потому что когда я пытаюсь показать общее количество профилей с помощью console.log(" Всего профилей: "+ $ cope.data.data.length) У меня следующий выход:

Всего профилей вне функции: $ scope.data: undefined

Кроме того, выполнение не синхронизируется, потому что сначала попробуйте показать значение $ scope.data, а затем значение из бэкэнд.

Как я могу синхронизировать этот вызов и правильно назначить выход функции переменной $ scope.data?

Есть ли способ сделать то, что я хочу, с помощью службы? Я пытаюсь это сделать, но переменная $ q всегда была неопределенной, и я не знаю, как правильно пройти. У вас есть пример, который отлично работает?

Изображение 174551

Теги:
angular-http

2 ответа

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

ОДИН ВАРИАНТ

заключается в том, чтобы назначить ваши $ scope.data в вашем обратном вызове из self.getData(). Как это:

$http.get(url)
    .success(function(data){
        deferred.resolve(data);
        $scope.data = self.getData(ServiceURL.url[7]); //Here is it.
        console.log("Total profiles: " + data.data.length);         
    });
  • 0
    Извините, но я не понимаю ваш пример ... self.getData - это вызов http.get, а в вашем примере вы вызываете self.getData внутри вашего вызова http.get ... Я потерян ...
  • 1
    Нет, ты не можешь. Функция success () будет запускаться как обратный вызов с ответом от сервера. Вне области действия success () данные будут собираться мусором. : / Кстати, посмотрите на документы $ http , синтаксис .success () был изменен на .then () как для успешных, так и для обратных вызовов.
Показать ещё 3 комментария
2

Не можете ли вы просто задать $ scope.data внутри функции, а затем вызвать функцию типа.

  function getProfiles(){
    $http.get(url).success(response){
        $scope.data = response;
     } 
  getProfiles();
  • 0
    Извините, но это не работает для меня. Вне функции $ scope.data не определено !!! И я не знаю почему ,,,

Ещё вопросы

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