powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / getAsync и trimPartialPage
19 сообщений из 19, страница 1 из 1
getAsync и trimPartialPage
    #36195157
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У htmldb_Get().get второй и третий параметры - теги, которые ограничивают необходимую часть результата (по умолчанию "<!--START-->" и "<!--END-->"). У htmldb_Get().getAsync параметр всего один - функция обратного вызова. А мне нужны и асинхронность, и часть результата, ограниченная определёнными тегами. И поскольку нигде я подобной штуки не нашёл, то сделал сам. Пишу здесь, авось кому-то пригодится.

Итак, у нас есть страница M, в которой будем через AJAX асинхронно обновлять HTML-код региона с id=RESULT_REGION (в принципе, обновлять можем любой не-input DOM-элемент, у которого есть атрибут innerHTML). В качестве содержимого для этого региона берём что-нибудь со страницы N, ограниченное тегами "<!--START_X-->" и "<!--END_X-->".

У htmldb_Get есть метод getPartial, который возвращает часть ответа между двумя тегами (первый и второй параметры метода). Но этот метод работает с полем htmldb_Get.response, которое при вызове GetAsync не заполняется. Поэтому, чтобы не писать собственный Trim для ответов сервера, а использовать уже готовый, надо присваивать этому полю p.response.

Ниже идёт JS-код из заголовка страницы M:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<script type="text/javascript">
  var get;
  
  function doIt(){
      get = new htmldb_Get(null, $v('pFlowId'),null,N /*Номер страницы с нужным содержимым*/ );
      get.GetAsync(f_AsyncReturn);
  };
  
  function f_AsyncReturn(){
    if (p.readyState== 4 ) {
/*Присваиваем текст ответа нашей переменной get*/
      get.response = p.responseText; 
/*Присваиваем содержимому нужного элемента часть ответа между двух тегов*/
      $x('RESULT_REGION').innerHTML=get.getPartial("<!--REPORT_START-->", "<!--REPORT_END-->");
      get = null;
    }
  }
</script>

Любые предложения и исправления приветствуются. Если кто-то скажет, что всё это можно сделать вот так в три раза короче и быстрее - буду только рад.
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36196046
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что бы реальней увидеть картину этого можно пожалуйста примерчик.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36198702
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLer,

А что если асинхронно запустить одновременно несколько раз doIt()? Обязательно возникнут накладки из-за использования переменных глобального контекста get и p.
Предлагаю вариант этого избежать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  function doIt(frame, page){
      var get;
      get = new htmldb_Get(null, $v('pFlowId'),null,page);
      get.p = get.GetAsync(function(){f_AsyncReturn(get, frame)});
  };
  
  function f_AsyncReturn(get, frame){
    if (get.p && get.p.readyState== 4 ) {
      get.response = get.p.responseText; 
      $x(frame).innerHTML = get.getPartial("<!--REPORT_START-->", "<!--REPORT_END-->");
      get = null;
    }
  }

GetAsync возвращает только-что установленную "p" ч-з return. Далее ее сохраняем в динамически созданном свойстве объекта get - get.p, чтобы потом конкретно с ней и работать в callback-функции. Сам get передаем тоже ч-з параметры callback-а, чтобы не регистрировать еще где-то.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36198900
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kvad,

Да, спасибо большое за замечание и вариант. :) Я добавил в нём ещё пару параметров, думаю, на этом можно остановиться.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  function doIt(frame, page, from_tag, to_tag){
      var get;
      get = new htmldb_Get(null, $v('pFlowId'),null,page);
      get.p = get.GetAsync(function(){f_AsyncReturn(get, frame, from_tag, to_tag)});
  };
  
  function f_AsyncReturn(get, frame, from_tag, to_tag){
    if (get.p && get.p.readyState== 4 ) {
      get.response = get.p.responseText; 
      $x(frame).innerHTML = get.getPartial(from_tag, to_tag);
      get = null;
    }
  }
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36198906
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvad,

переменная get будет уничтожена при выходе из doit(), не так ли?
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36199024
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ossv,

Нет, ссылка на get используется в контексте анонимной ф-ции, определенной при вызове GetAsync, которая, в свою очередь, далее используется объектом XMLHttpRequest как callback-ф-ция, поэтому сборщик мусора ее не сможет уничтожить при выходе из doIt. Локальные переменные в js реализуются не ч-з стек, они будут жить, пока кто-нибудь на них ссылается.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36199207
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvadossv,

Нет, ссылка на get используется в контексте анонимной ф-ции, определенной при вызове GetAsync, которая, в свою очередь, далее используется объектом XMLHttpRequest как callback-ф-ция, поэтому сборщик мусора ее не сможет уничтожить при выходе из doIt. Локальные переменные в js реализуются не ч-з стек, они будут жить, пока кто-нибудь на них ссылается.
А кто ссылается на данные созданные в doit() вне контекста doit() по выходе из doit()? Вроде бы никакому внешнему объекту ссылки не передаются.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36199248
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ossv,

ссылается f_AsyncReturn, в которую get передаётся в качестве фактического параметра и которая вызывается объектом XMLHttpRequest. :)
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36200601
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerossv,

ссылается f_AsyncReturn, в которую get передаётся в качестве фактического параметра и которая вызывается объектом XMLHttpRequest. :)
Шутить изволите? Не f_AsyncReturn ссылается, а на нее ссылаются экземпляры анонимной функции созданные в контексте doit(). Я вот не вижу никакого сохранения ссылки на get вне контекста doit(). Да, ссылка на get используется в анонимной функции, экземпляр анонимной функции создан в контексте doit() и сохранен в объекте get через get.GetAsync(). Никакого выхода во внешний контекст не наблюдается. В каком месте внешнего контекста сидит ссылка на объект new htmldb_Get (он же get, он же XMLHttpRequest) по выходе из doit()?
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36201080
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ossv,

я пока чайник в JS, мне ещё много предстоит прочитать и узнать... Но почему new htmldb_Get Вы считаете тем же XMLHttpRequest? Вроде экземпляр второго только записывается при вызове htmldb_Get.GetAsync в поле htmldb_Get.p.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36201232
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ossv,

А причем здесь внешний контекст? get доступна ч-з связывание scope (области видимости) doIt (в которой "живет" get) и определенной в ней анонимной.

RTFM: Замыкания
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36201360
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerossv,

я пока чайник в JS, мне ещё много предстоит прочитать и узнать... Но почему new htmldb_Get Вы считаете тем же XMLHttpRequest? Вроде экземпляр второго только записывается при вызове htmldb_Get.GetAsync в поле htmldb_Get.p.
Я конечно не в буквальном смысле имел в виду, а по сути. htmldb_Get это суть обертка вокруг XMLHttpRequest, который, да, там внутри htmldb_Get-а сидит, как р = new XMLHttpRequest() .
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36201417
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvadossv,

А причем здесь внешний контекст? get доступна ч-з связывание scope (области видимости) doIt (в которой "живет" get) и определенной в ней анонимной.

RTFM: Замыкания

Внешний контекст при том, что если в нем нет ссылок на к.либо данные, которые были созданы
внутри doit(), то эти данные должны быть удалены сборщиком мусора, иначе получится memory leak.

Про замыкания я в курсе. Объясните, пожалуйста, почему сборщик мусора не удалит Ваше замыкание (экземпляр анонимной функции) по выходе из doit()?
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36201720
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ossv
Про замыкания я в курсе. Объясните, пожалуйста, почему сборщик мусора не удалит Ваше замыкание (экземпляр анонимной функции) по выходе из doit()?

По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange.
Здесь более любопытен вопрос, когда же сборщик убивает анонима и get?
Сдается мне, что get = null; в f_AsyncReturn роли в этом особой не играет.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36202509
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvad
По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange.
А на экземпляр XMLHttpRequest кто ссылается кроме get?

kvadЗдесь более любопытен вопрос, когда же сборщик убивает анонима и get?

И еще XMLHttpRequest-а убъет ведь. Я не прав?
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36202653
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ossvkvad
По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange.
А на экземпляр XMLHttpRequest кто ссылается кроме get?

Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest), а также, как понимаю, сама callback closure с f_AsyncReturn.

ossvkvadЗдесь более любопытен вопрос, когда же сборщик убивает анонима и get?

И еще XMLHttpRequest-а убъет ведь. Я не прав?

Должен убить, хоть и циклические ссылки наличествуют. В ИЕ вроде из-за использования activex глюк с memory leak связанный с этим был.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36202928
ossv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kvad
Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest)
Вы уверены, что это присвоение глобальному контексту, а не полю внутри контекста с которым вызван GetAsync - get.GetAsync()? Для чего бы GetAsync могло понадобиться покурочить глобальную переменную p?
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36203712
kvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ossvkvad
Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest)
Вы уверены, что это присвоение глобальному контексту, а не полю внутри контекста с которым вызван GetAsync - get.GetAsync()? Для чего бы GetAsync могло понадобиться покурочить глобальную переменную p?

Ф-ция GetAsync объявлена в прототипе htmldb_Get, а там идет присвоение:
Код: plaintext
p = new XMLHttpRequest();
заметьте, не var p, не this.p, а просто p. В этом случае p трактуется как свойство глоб. контекста, т.е. проще говоря, window.p. Хотите 100% убедиться своими глазами - посмотрите с помощью firebug.

В свете этого, текущая (apex v.3.x) реализация GetAsync без этих "хаков" не позволяет использовать ее для нормальной одновременной загрузки >1 аякс-потока. GetAsync сейчас используется в самом апексе для реализации некоторых виджетов, там видимо параллельность не требуется. Одно то, что в стандартном виде (без iframe-ов) нельзя на странице использовать > 1 IR, говорит о заниженных в этом плане требованиях разработчиками апекса.
...
Рейтинг: 0 / 0
getAsync и trimPartialPage
    #36203753
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kvad , ossv ,

коллеги, спасибо большое вам за такую дискуссию! Лично для меня как читателя это был хороший ликбез и направление для чтения в книжках. :)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / getAsync и trimPartialPage
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]