Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2015, 23:29
Новичок на форуме
Отправить личное сообщение для Zalex Посмотреть профиль Найти все сообщения от Zalex
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 30.05.2015, 13:37
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Zalex
В случае если например
Чтобы поставить точку надо все вот так заново создавать?

Ваш паттерн я вообще не понял.
Ответить с цитированием
  #3 (permalink)  
Старый 30.05.2015, 13:40
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Обычно делается так

var stat = new Stat;

ожидание команды

поступила команда

получение данных соотв команде

получили данные

stat.setData(new Date()).write();

ожидание команды

команда, нужны данные соотв команде, получили данные

stat.setData(new Date()).write();

ожидание команды...

Ну или так

stat.write(data); или не так?
Ответить с цитированием
  #4 (permalink)  
Старый 30.05.2015, 16:05
Новичок на форуме
Отправить личное сообщение для Zalex Посмотреть профиль Найти все сообщения от Zalex
 
Регистрация: 22.01.2014
Сообщений: 7

Сообщение от kostyanet Посмотреть сообщение
Чтобы поставить точку надо все вот так заново создавать?

Ваш паттерн я вообще не понял.
Не очень понятен мне вопрос.

Попытаюсь еще раз попытаться рассказать.

Сущствует конструктор Source, в котором я описываю данные, нужные мне для отрисовки. Те данные, что я хочу отрисовать я закидываю через setData , отрисовывает другой объект, через метод write.

Сложность в том чтоб вызывать метод write из другого объекта, в том случае когда один из объектов реализующих Stat имеет не статические данные, а получаемые через Ajax.

Сложность так же в том, что Ajax работает через callback функции , т.е. условно говоря могу вызвать нужный мне метод отрисовки только после получения данных, но свойство с данными может быть как ajax получаемые, так и статически объявленными.
Ответить с цитированием
  #5 (permalink)  
Старый 30.05.2015, 16:17
Новичок на форуме
Отправить личное сообщение для Zalex Посмотреть профиль Найти все сообщения от Zalex
 
Регистрация: 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/ смотрю читаю. Думаю это решит вопрос.
Ответить с цитированием
  #6 (permalink)  
Старый 31.05.2015, 19:30
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Понимаете в чем тут хитрость. Вы излагаете какими-то академическими терминами, чего там-там конструируется, реализуется, регистрируется и бла-бла-бла, а элементарную event-driven апликуху сделать не можете. Из чего можно сделать вывод, что за всем изложенным какой-то гавнокод по хз каким канонам.

Сообщение от Zalex
мой метод write должен забрать
Вот именно, потому что все неправильно изначально. Никогда не было такого, чтобы запись сама куда-то ходила и кого-то там тормошила - дай, ну дай, ну отдай. Ну или требуется неоспоримое событие, типа раз с секунду записывать показания манометра самогонного аппарата.
Ответить с цитированием
  #7 (permalink)  
Старый 31.05.2015, 19:38
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Zalex
и если они получаемые асинхронно
Ну так включите опцию синхронизировать. Есть такая.

Еще может Worker поможет https://developer.mozilla.org/en-US/...ng_web_workers

Последний раз редактировалось kostyanet, 31.05.2015 в 19:40.
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2015, 16:57
Новичок на форуме
Отправить личное сообщение для Zalex Посмотреть профиль Найти все сообщения от Zalex
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 01.06.2015, 18:21
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Когда впервые увидел исходники Yii - есть такой модный фрейморк - подумал какие-такие события вообще могут быть на php, ну таймер можно запустить наверно, а так кому еще там их генерить-то, юзера же нету, а все остальное не научно.

А у вас в js вообще никаких событий нет в той апликухе? Она как запустилась так и молотит пока данные не кончатся?
Ответить с цитированием
  #10 (permalink)  
Старый 01.06.2015, 18:24
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Zalex
deferred объект, а $.when с этим делом работает
Ну то есть два колбека матрешкой. Систематически такое случается. Но дело не в этом. Вы упорно не колетесь о генеральной модели приложения.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX, Только передача данных. NewJSUser AJAX и COMET 14 12.01.2015 17:38
Обработка AJAX - данных (UserScript) fesskerl Events/DOM/Window 1 15.11.2013 23:40
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
ajax чат проблема с записью сообщения в базу данных mysql. Niksik AJAX и COMET 4 15.01.2012 14:04
Синхронный запрос данных по AJAX Shasoft AJAX и COMET 2 03.03.2009 14:07