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 с этим делом работает
|
Ну то есть два колбека матрешкой. Систематически такое случается. Но дело не в этом. Вы упорно не колетесь о генеральной модели приложения.
|
|
|
|