1

У вас есть две проблемы. Я пытаюсь получить значение из ответа $ 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 помещен в функции внутри контроллера показывает «неопределенными».

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

ответ

0

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

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

Сервис

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); 
    }); 
}; 

Controller

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; 
     }); 
    }; 
}]); 

 Смежные вопросы

  • Нет связанных вопросов^_^