Проблемы с $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¶m1=" + 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¶m1=" + 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¶m1=" + 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¶m1=" + 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;
});
};
}]);