Проблемы с $http, AngularJS

Есть две проблемы. Я пытаюсь получить значение из ответа $http и заполнить его переменной, которая затем должна обновить пару объектов DOM. Проблема в том, что, похоже, возникла проблема с синхронизацией, когда функция, вызывающая службу $http, завершает работу, а затем переменная обновляется, но, похоже, не обновляется везде, где должна. Я также попытался поместить часы в переменную, и кажется, что она срабатывает только при начальной загрузке страницы. Я читал все это весь день и не могу найти ответ, который работает.

app.controller('MainCtrl', ['$scope', '$http', 'waciServ', function($scope,      $http, waciServ) {
"use strict";
$scope.currentSource = waciServ.activeSource;

$scope.$watch('waciServ.activeSource', function(newValue, oldValue) {
        $scope.currentSource = newValue;
        console.log('Watcher! ' + newValue);
}/*, true*/);

$scope.getActiveSource = function () {
    $scope.currentSource = waciServ.getStringByName("active_device");
};
}]);

app.service('waciServ', function($http) {
  var self = this;
  this.waciIP = location.host;
  this.activeSource = '';

  this.getStringByName = function (name) {
    $http.post("http://" + self.waciIP + "/rpc/", "method=GetVariableByName&param1=" + name + "&encoding=2")
        .then (function (response) {
            var was_error = self.read(response.data);

            if (was_error == '1') { //active_device is not set
                self.assignVariable(name, "none");
                self.activeSource = "none";
                return self.activeSource;

            } else {
                var varId = parseInt(self.read(response.data));
                $http.post("http://" + self.waciIP + "/rpc/", "method=GetVariableValue&param1=" + varId + "&encoding=2")
                    .then (function (response) {

                        self.activeSource = self.read(response.data);

                        return self.activeSource;      
                });
            }
    }, function (error) {
        console.log("error: " + error.data);
    });
  };
});

я могу поместить console.log прямо перед срабатыванием возврата и увидеть, что у меня есть то, что я хочу, но другой файл console.log, помещенный в функцию в контроллере, показывает "undefined".

Что дает? Заранее спасибо.

1 ответ

Решение

Вам не нужно думать об использовании наблюдателя.

В основном проблема в том, что вы не возвращаете обещание от метода обслуживания. Вы должны вернуть обещание $http вызовы методов из вашего сервисного метода. Последующее использование .then вызов метода по цепочке обещание и положить success & error функция в нем. ( этот ответ мало похож на то, что вы спрашиваете, но не совсем)

обслуживание

self.getStringByName = function(name) {
  //returned promise from here
  return $http.post("http://" + self.waciIP + "/rpc/", "method=GetVariableByName&param1=" + name + "&encoding=2")
    .then(function(response) {
    var was_error = self.read(response.data);

    if (was_error == '1') { //active_device is not set
      self.assignVariable(name, "none");
      self.activeSource = "none";
      return self.activeSource; //returned data here to chain promise
    } else {
      var varId = parseInt(self.read(response.data));
      //returned promise from here
      return $http.post("http://" + self.waciIP + "/rpc/", "method=GetVariableValue&param1=" + varId + "&encoding=2")
        .then(function(response) {
        self.activeSource = self.read(response.data);
        //returned data from here
        return self.activeSource;
      });
    }
  }, function(error) {
    console.log("error: " + error.data);
  });
};

контроллер

app.controller('MainCtrl', ['$scope', '$http', 'waciServ', function($scope,      $http, waciServ) {
"use strict";
   $scope.currentSource = waciServ.activeSource;

   $scope.getActiveSource = function () {
      waciServ.getStringByName("active_device").then(function(source){
         $scope.currentSource = source;
      });
   };
}]);
Другие вопросы по тегам