| 
	| 
	
	| 
		
	| 
			
			 
			
				29.05.2015, 23:29
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 22.01.2014 
						Сообщений: 7
					 
		
 |  |  
	| 
				Отрисовка данных получаемых разными способами (ajax + static)
			 Добрый день. Не знаю как правильнее сформулировать вопрос в одном заголовке, попытаюсь написать подробнее в чем непонимание.
 У меня есть некий объект Stat (буду там именовать для удобства), умеющий рисовать данные. Метод отрисовки может быть примерно таков -
 
 Stat.prototype.write = function () {
 this.$point.append(this.data);
 };
 Метод отрисовки вызывается из другого объекта.
 Данные тоже передаются из внешней функции через метод
 
 Stat.prototype.setData = function (data) {
 this.data = data
 }
 
 В случае если например
 var data = new Date();
 var stat = new Stat;
 stat.setData(data);
 stat.write();
 
 У меня все хорошо, быть иначе и не могло бы, и все что нужно отрисовано, а вот когда мне нужно data получить по Ajax, я совершенно перестаю понимать что именно мне нужно передать в метод setData при инициализации объекта. Смысл в том что мне нужно чтоб метод write дергал  this.data, где бы жила ajax фукнция и после получения данных происходила дальше отрисовка.
 
 Думается что есть какие то паттерны для этих задач, но что то не знаю куда копнуть. Спасибо.
 
 p.s. Насколько я понимаю мне б что то как то реализовать в виде promise , чтоб  мой метод write вызывал  getData, и после получения шел рисовать дальше. Но я не понимаю чего-то, что не дает мне понять картину происходящего .
 
 Я лишь вижу возможность инициировать аяксом дальнейшую отрисовку, а мне нужно в точности наоборот, инициировать аякс, дождаться его выполнения и уж потом продолжить дальше. Как сделать, не знаю.
 			 Последний раз редактировалось Zalex, 29.05.2015 в 23:43.
 |  |  
	| 
		
	| 
			
			 
			
				30.05.2015, 13:37
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| 
	
 
	| Сообщение от Zalex |  
	| В случае если например |  
	
 Чтобы поставить точку надо все вот так заново создавать?
 
Ваш паттерн я вообще не понял. |  |  
	| 
		
	| 
			
			 
			
				30.05.2015, 13:40
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| Обычно делается так
 var stat = new Stat;
 
 ожидание команды
 
 поступила команда
 
 получение данных соотв команде
 
 получили данные
 
 stat.setData(new Date()).write();
 
 ожидание команды
 
 команда, нужны данные соотв команде, получили данные
 
 stat.setData(new Date()).write();
 
 ожидание команды...
 
 Ну или так
 
 stat.write(data); или не так?
 |  |  
	| 
		
	| 
			
			 
			
				30.05.2015, 16:05
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 22.01.2014 
						Сообщений: 7
					 
		
 |  |  
	| 
	
 
	| Сообщение от kostyanet   |  
	| Чтобы поставить точку надо все вот так заново создавать? 
 Ваш паттерн я вообще не понял.
 |  
	
 Не очень понятен мне вопрос.  
 
Попытаюсь еще раз попытаться рассказать.
 
Сущствует конструктор Source, в котором я описываю данные, нужные мне для отрисовки. Те данные, что я хочу отрисовать я закидываю через setData , отрисовывает другой объект, через метод write. 
 
Сложность в том чтоб вызывать метод write из другого объекта, в том случае когда один из объектов реализующих Stat имеет не статические данные, а получаемые через Ajax.
 
Сложность так же в том, что Ajax работает через callback функции , т.е. условно говоря могу вызвать нужный мне метод отрисовки только после получения данных, но свойство с данными может быть как ajax получаемые, так и статически объявленными. |  |  
	| 
		
	| 
			
			 
			
				30.05.2015, 16:17
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 22.01.2014 
						Сообщений: 7
					 
		
 |  |  
	| 
	
 
	| Сообщение от kostyanet   |  
	| Обычно делается так 
 var stat = new Stat;
 
 ожидание команды
 
 поступила команда
 
 получение данных соотв команде
 
 получили данные
 
 stat.setData(new Date()).write();
 
 ожидание команды
 
 команда, нужны данные соотв команде, получили данные
 
 stat.setData(new Date()).write();
 
 ожидание команды...
 
 Ну или так
 
 stat.write(data); или не так?
 |  
	
 Существует конструктор (для удобства я буду называть класс) Source, в котором регистрируется множество объектов, реализующих Stat,  именно он (объект source) вызывает  методы отрисовки в массиве конечных объектов и он не знает и знать не должен реализацию отрисовки. Соответственно мой метод write должен забрать из объектов реализующих класс Stat  свойство data, которое в моем случае может быть как получаемое по ajax, так и статическое, например Дата-время или любое другое значение, и отрисовать.  Но! Когда я забираю данные , то мой метод write не ждет естественно , а забирает ровно то, что есть на текущий момент в ссылке на переменную и если там аякс - то он не дожидается результата. И тут вопрос, как же сделать так, чтоб одним методом можно было забрать данные и если они получаемые асинхронно, то метод отрисовки ждал бы сначала результата, а потом продолжал бы работать (естественно не вешал бы остальной код).
 
Один товарищ тут подсказал про jQuery Deffered   https://api.jquery.com/category/deferred-object/     смотрю читаю. Думаю это решит вопрос.
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				31.05.2015, 19:30
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| Понимаете в чем тут хитрость. Вы излагаете какими-то академическими терминами, чего там-там конструируется, реализуется, регистрируется и бла-бла-бла, а элементарную event-driven апликуху сделать не можете. Из чего можно сделать вывод, что за всем изложенным какой-то гавнокод по хз каким канонам. 
	
 
	| Сообщение от Zalex |  
	| мой метод write должен забрать |  
	
 Вот именно, потому что все неправильно изначально. Никогда не было такого, чтобы запись сама куда-то ходила и кого-то там тормошила - дай, ну дай, ну отдай. Ну или требуется неоспоримое событие, типа раз с секунду записывать показания манометра самогонного аппарата. |  |  
	| 
		
	| 
			
			 
			
				31.05.2015, 19:38
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| 
	
 
	| Сообщение от Zalex |  
	| и если они получаемые асинхронно |  
	
 Ну так включите опцию синхронизировать. Есть такая.
 
Еще может Worker поможет https://developer.mozilla.org/en-US/...ng_web_workers			 Последний раз редактировалось kostyanet, 31.05.2015 в 19:40.
 |  |  
	| 
		
	| 
			
			 
			
				01.06.2015, 16:57
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 22.01.2014 
						Сообщений: 7
					 
		
 |  |  
	| Совет про синхронность тем страннее, чем дольше длится запрос моих данных   ))
 
Что касаемо темы, вопрос решился таким образом. Не pure js, но все же.
 
var data, rawdata = this.data(), that = this;
    $.when(rawdata).then(function () {
        if(rawdata.responseText) {
            data = rawdata.responseText;
        } else {
            data = rawdata;
        }
        that.write(data);
    });
Оказалось что $.ajax возвращает ко всему прочему deferred объект, а $.when с этим делом работает. Если же функция которой я забираю данные из объекта возвращает любой другой, не deferred, то $.when "исполняет" сразу же дальнейшие действия.  Вот и получается что такое простой проверкой я забираю любые данные и если они асинхронно получаемые - вставляю их по достижению результата.
 
Ну и при отсутствии значения responseText в возвращаемом значении, я только догадываюсь что это не аякс и вывожу само значение. 
 
Возможно кто то сможет подсказать, как же именно мне узнать какой тип функции я получаю, что потом адекватно забирать из них данные.
 
p.s. Ну и не забывать передавать объекту в виде функции, возвращаемой нужные мне данные. Т.е. если мне понадобится передать попросту текст (что конечно абсурдно, но просто для примера) я задаю данные через функцию в виде 
 
var data = function () {return 'Мои данные'};
myObject.setData(data);
			 Последний раз редактировалось Zalex, 01.06.2015 в 17:01.
 |  |  
	| 
		
	| 
			
			 
			
				01.06.2015, 18:21
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| Когда впервые увидел исходники Yii - есть такой модный фрейморк - подумал какие-такие события вообще могут быть на php, ну таймер можно запустить наверно, а так кому еще там их генерить-то, юзера же нету, а все остальное не научно.
 А у вас в js вообще никаких событий нет в той апликухе? Она как запустилась так и молотит пока данные не кончатся?
 |  |  
	| 
		
	| 
			
			 
			
				01.06.2015, 18:24
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.10.2010 
						Сообщений: 2,718
					 
		
 |  |  
	| 
	
 
	| Сообщение от Zalex |  
	| deferred объект, а $.when с этим делом работает |  
	
 Ну то есть два колбека матрешкой. Систематически такое случается. Но дело не в этом. Вы упорно не колетесь о генеральной модели приложения. |  |  |  |