Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

JsHttpRequest асинхронная подгрузка контента (x-sam)
Author Message
x-sam
Заглянувший



Joined: 09 Jul 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 09, 2009 7:52 pm (написано за 4 минуты 51 секунду)
   Post subject: JsHttpRequest асинхронная подгрузка контента
Reply with quote

Пересмотрел документации по библиотеке, но подходящего не нашел подходящего для меня решения.
в чем суть проблемы:

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

для примера приведены скрипты ниже:
фронтенд
[]
Code (html): скопировать код в буфер обмена
<script (december.com/html/4/element/script.html) src="lib/JsHttpRequest/JsHttpRequest.js"> (december.com/html/4/element/.html)</script>
<script (december.com/html/4/element/script.html) language="JavaScript"> (december.com/html/4/element/.html)

function doLoad() {
    var req = new JsHttpRequest();
    // Code automatically called on load finishing.
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            // Write result to page element ($_RESULT become responseJS).
            document.getElementById('ans').innerHTML =
                req.responseJS.str+ req.responseJS.md5 + '<br (december.com/html/4/element/br.html) /> (december.com/html/4/element/.html) ';
            // Write debug information too (output become responseText).
            document.getElementById('debug').innerHTML = req.responseText;
        }
    }
    // Prepare request object (automatically choose GET or POST).
    req.open(null, 'my_b.php', true);
    // Send whole form data to backend.
    req.send( { 'str': document.getElementById("mystr").value } );
}
</script>

<!-- Please note that we must specify enctype to multipart/form-data! -->
<form (december.com/html/4/element/form.html) method="post" enctype="multipart/form-data" onsubmit="return false"> (december.com/html/4/element/.html)
    Enter a text: <input (december.com/html/4/element/input.html) type="text" id="mystr"> (december.com/html/4/element/.html)<br> (december.com/html/4/element/br.html)   
    <input (december.com/html/4/element/input.html) type="button" value="Calculate MD5" onclick="doLoad()"> (december.com/html/4/element/.html)<br (december.com/html/4/element/br.html) /> (december.com/html/4/element/.html)
</form>

<div (december.com/html/4/element/div.html) id="ans" style="border:1px solid #000; padding:2px"> (december.com/html/4/element/.html)
    Structured results
</div>
[/]

бекенд
[]
Code (php): скопировать код в буфер обмена
<?php
require_once "lib/JsHttpRequest/JsHttpRequest.php";
// Init JsHttpRequest and specify the encoding. It's important!
$JsHttpRequest =& new JsHttpRequest("windows-1251");
// Fetch request parameters.
$str = $_REQUEST['str'];

// Create the resulting array.
    $GLOBALS['_RESULT'] = array (www.php.net/array)(
      "str"   => 'md5(',
      "md5"   => '',
    );
   
    sleep (www.php.net/sleep)(5);
   
    $GLOBALS['_RESULT'] = array (www.php.net/array)(
      "str"   => $GLOBALS['_RESULT']['str'].$str.')=',
      "md5"   => md5 (www.php.net/md5)($str),
    );
   
// This includes a PHP fatal error! It will go to the debug stream,
// frontend may intercept this and act a reaction.
if ($_REQUEST['str'] == 'error') {
  error_demonstration__make_a_mistake_calling_undefined_function();
}
?>
[/]

вопросы которые интересуют и требуют решения:
как отдавать контент при асинхронной загрузке?
как получать его в фронтенде?

искал какие-то примеры через readyState и статус, но ничего норм. так и не нашел. Заранее спасибо за внимание и ответы
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jul 09, 2009 8:17 pm (спустя 24 минуты; написано за 4 минуты 31 секунду)
   Post subject:
Reply with quote

x-sam
см. мою библиотеку WebDemon, она как раз для этого. Интерфейс не сильно отличается от JsHttpRequest, в нем есть функция send() вместо присваивания $_RESULT, что ухудшает возможности отладки приложения (на данный момент). forum.dklab.ru/viewtopic.php?p=168812#168812

Единственный недостаток -- у меня библиотека не поддерживает регистрацию нескольких обработчиков и повторную регистрацию обработчика. Впрочем, эти проблемы не слишком сложно решаются, если написать метод forget() во фронтенде:
Code (JavaScript): скопировать код в буфер обмена
T.forget = function()
        {
                try{
                        document.body.removeChild($('webdemon_iframe'));
                        clearTimeout(next_timeout);
                        next_timeout = null;
                        backend_src = null;
                        onrecieve = null;
                }catch(e){
                        return false;
                }
               
                return true;
        }
Вызывать forget() нужно после завершения обработки (для этого желательно в завершение работы скрипта добавить строчку с $wd->send(...);, которая будет однозначно сигнализировать о том, что скрипт завершился и нужно вызвать forget()).
Back to top
View user's profile Send private message Send e-mail
x-sam
Заглянувший



Joined: 09 Jul 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 09, 2009 10:43 pm (спустя 2 часа 25 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

хм.. интересное решение, но тут всё работает через еще один дополнительный файл, как вариант возможно.

ну а JsHttpRequest разве не предоставляет таких возможностей?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu Jul 09, 2009 11:27 pm (спустя 44 минуты; написано за )
   Post subject:
Reply with quote

Неа.
Back to top
View user's profile Send private message Send e-mail
x-sam
Заглянувший



Joined: 09 Jul 2009
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Fri Jul 10, 2009 4:30 pm (спустя 17 часов 2 минуты; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

ваш вариант неплохой, но как он поведёт себя при большой количестве пользователей онлайн?
тестировалась ли библиотека при больших нагрузках?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Fri Jul 10, 2009 4:43 pm (спустя 12 минут; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

x-sam wrote:
ваш вариант неплохой, но как он поведёт себя при большой количестве пользователей онлайн?
тестировалась ли библиотека при больших нагрузках?
Вообще, всё от Вас зависит. В архиве есть пример написания чат-демона, который, в общем-то, может выдерживать много пользователей при небольшой нагрузке на сервер. Но и писать его не так просто.
Сама библиотека к нагрузке не чувствительна.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML