|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
У 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.
Любые предложения и исправления приветствуются. Если кто-то скажет, что всё это можно сделать вот так в три раза короче и быстрее - буду только рад. ------------------------------------------------------- When I say "RTFM" or "STFF" or "STFW", the third letter means "Following" or "Fine"... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2009, 20:15 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
Что бы реальней увидеть картину этого можно пожалуйста примерчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2009, 11:19 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
suPPLer, А что если асинхронно запустить одновременно несколько раз doIt()? Обязательно возникнут накладки из-за использования переменных глобального контекста get и p. Предлагаю вариант этого избежать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
GetAsync возвращает только-что установленную "p" ч-з return. Далее ее сохраняем в динамически созданном свойстве объекта get - get.p, чтобы потом конкретно с ней и работать в callback-функции. Сам get передаем тоже ч-з параметры callback-а, чтобы не регистрировать еще где-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 12:02 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvad, Да, спасибо большое за замечание и вариант. :) Я добавил в нём ещё пару параметров, думаю, на этом можно остановиться. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 12:58 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvad, переменная get будет уничтожена при выходе из doit(), не так ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 13:00 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossv, Нет, ссылка на get используется в контексте анонимной ф-ции, определенной при вызове GetAsync, которая, в свою очередь, далее используется объектом XMLHttpRequest как callback-ф-ция, поэтому сборщик мусора ее не сможет уничтожить при выходе из doIt. Локальные переменные в js реализуются не ч-з стек, они будут жить, пока кто-нибудь на них ссылается. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 13:32 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvadossv, Нет, ссылка на get используется в контексте анонимной ф-ции, определенной при вызове GetAsync, которая, в свою очередь, далее используется объектом XMLHttpRequest как callback-ф-ция, поэтому сборщик мусора ее не сможет уничтожить при выходе из doIt. Локальные переменные в js реализуются не ч-з стек, они будут жить, пока кто-нибудь на них ссылается. А кто ссылается на данные созданные в doit() вне контекста doit() по выходе из doit()? Вроде бы никакому внешнему объекту ссылки не передаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 14:42 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossv, ссылается f_AsyncReturn, в которую get передаётся в качестве фактического параметра и которая вызывается объектом XMLHttpRequest. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2009, 14:52 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
suPPLerossv, ссылается f_AsyncReturn, в которую get передаётся в качестве фактического параметра и которая вызывается объектом XMLHttpRequest. :) Шутить изволите? Не f_AsyncReturn ссылается, а на нее ссылаются экземпляры анонимной функции созданные в контексте doit(). Я вот не вижу никакого сохранения ссылки на get вне контекста doit(). Да, ссылка на get используется в анонимной функции, экземпляр анонимной функции создан в контексте doit() и сохранен в объекте get через get.GetAsync(). Никакого выхода во внешний контекст не наблюдается. В каком месте внешнего контекста сидит ссылка на объект new htmldb_Get (он же get, он же XMLHttpRequest) по выходе из doit()? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 10:35 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossv, я пока чайник в JS, мне ещё много предстоит прочитать и узнать... Но почему new htmldb_Get Вы считаете тем же XMLHttpRequest? Вроде экземпляр второго только записывается при вызове htmldb_Get.GetAsync в поле htmldb_Get.p. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 12:57 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossv, А причем здесь внешний контекст? get доступна ч-з связывание scope (области видимости) doIt (в которой "живет" get) и определенной в ней анонимной. RTFM: Замыкания ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 13:29 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
suPPLerossv, я пока чайник в JS, мне ещё много предстоит прочитать и узнать... Но почему new htmldb_Get Вы считаете тем же XMLHttpRequest? Вроде экземпляр второго только записывается при вызове htmldb_Get.GetAsync в поле htmldb_Get.p. Я конечно не в буквальном смысле имел в виду, а по сути. htmldb_Get это суть обертка вокруг XMLHttpRequest, который, да, там внутри htmldb_Get-а сидит, как р = new XMLHttpRequest() . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 13:52 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvadossv, А причем здесь внешний контекст? get доступна ч-з связывание scope (области видимости) doIt (в которой "живет" get) и определенной в ней анонимной. RTFM: Замыкания Внешний контекст при том, что если в нем нет ссылок на к.либо данные, которые были созданы внутри doit(), то эти данные должны быть удалены сборщиком мусора, иначе получится memory leak. Про замыкания я в курсе. Объясните, пожалуйста, почему сборщик мусора не удалит Ваше замыкание (экземпляр анонимной функции) по выходе из doit()? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 14:04 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossv Про замыкания я в курсе. Объясните, пожалуйста, почему сборщик мусора не удалит Ваше замыкание (экземпляр анонимной функции) по выходе из doit()? По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange. Здесь более любопытен вопрос, когда же сборщик убивает анонима и get? Сдается мне, что get = null; в f_AsyncReturn роли в этом особой не играет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 15:18 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvad По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange. А на экземпляр XMLHttpRequest кто ссылается кроме get? kvadЗдесь более любопытен вопрос, когда же сборщик убивает анонима и get? И еще XMLHttpRequest-а убъет ведь. Я не прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 18:24 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossvkvad По выходе из doIt на экземпляр анонимной функции остается ссылка от XMLHttpRequest (либо ActiveXObject("Msxml2.XMLHTTP")) .onreadystatechange. А на экземпляр XMLHttpRequest кто ссылается кроме get? Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest), а также, как понимаю, сама callback closure с f_AsyncReturn. ossvkvadЗдесь более любопытен вопрос, когда же сборщик убивает анонима и get? И еще XMLHttpRequest-а убъет ведь. Я не прав? Должен убить, хоть и циклические ссылки наличествуют. В ИЕ вроде из-за использования activex глюк с memory leak связанный с этим был. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2009, 19:37 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
kvad Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest) Вы уверены, что это присвоение глобальному контексту, а не полю внутри контекста с которым вызван GetAsync - get.GetAsync()? Для чего бы GetAsync могло понадобиться покурочить глобальную переменную p? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2009, 00:15 |
|
getAsync и trimPartialPage
|
|||
---|---|---|---|
#18+
ossvkvad Свойство p глобального контекста (window) - есть присвоение в GetAsync (но оно ссылается только на последний запущенный XMLHttpRequest) Вы уверены, что это присвоение глобальному контексту, а не полю внутри контекста с которым вызван GetAsync - get.GetAsync()? Для чего бы GetAsync могло понадобиться покурочить глобальную переменную p? Ф-ция GetAsync объявлена в прототипе htmldb_Get, а там идет присвоение: Код: plaintext
В свете этого, текущая (apex v.3.x) реализация GetAsync без этих "хаков" не позволяет использовать ее для нормальной одновременной загрузки >1 аякс-потока. GetAsync сейчас используется в самом апексе для реализации некоторых виджетов, там видимо параллельность не требуется. Одно то, что в стандартном виде (без iframe-ов) нельзя на странице использовать > 1 IR, говорит о заниженных в этом плане требованиях разработчиками апекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2009, 12:09 |
|
|
start [/forum/topic.php?fid=50&tid=1877261]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 160ms |
0 / 0 |