Добавляем...


Двухсторонняя коммуникация
Передача информации от браузера к серверу без обратной связи может быть по-лезной, но более сложные задачи можно решать в том случае, когда программный код JavaScript получает возвращаемые значения. В этом разделе мы рассмотрим несколько подходов, позволяющих реализовать двухстороннюю коммуникацию ("настоящий" удаленный вызов процедур), продвигаясь от простого к сложному. Техника, которую мы собираемся обсудить, не представляет собой единственный механизм, с помощью которого можно выполнять RPC-обмен. Можно использовать JavaScript с другими ви-дами динамического содержимого, управлять обращающимися к серверу аплетами Java и выполняющими задачи сетевого обмена элементами управления ActiveX или же использовать фирменные расширения браузера, например возможности источника данных IE.

Изображения

Поскольку значения свойств height и width объекта Image автоматически за-даются браузером при загрузке изображения, сервер может возвращать изображения подходящих размеров в качестве сообщений коммуникации для JavaScript. Например, узел может иметь систему интерактивного общения (чат) на основе Java, которую пользователи имеют возможность использовать, если их друзья в данный момент тоже являются посетителями узла. Поскольку желательно запускать соответствующий аплет Java только тогда, когда пользователю есть к кому обратиться в сети, можно использовать программный код JavaScript для быстрого получения от сервера сведений о том, кто доступен в данный момент. С помощью объекта Image программный код JavaScript может выдать RPC-запрос серверу о том, доступен ли в данный момент конкретный пользователь. Если собеседник доступен, сервер может возвратить изображение высотой в один пиксель, а если нет в два пикселя. Вот пример применения указанного подхода:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Пpoвepкa доступности пользователей</title>
</head>
<body>
<script type="text/javascript">
var commandURL = "http://demos.javascriptref.com/isuseronline.php?";
// Запросы не обязательно выполняются сразу, поэтому необходимо
// периодически проверять состояние.
var timer = null;
var currentRequest = null;
// Отправка RPC с данным url, а затем вызов функции, // заданной параметром
function sendRPC(url, callback)
{
// Если уже есть обрабатываемый запрос, отменить его
if (currentRequest)
clearTimeout(timer);
currentRequest = new Image();
currentRequest.src = url; // Send rpc
setTimeout(callback, 50); // Check for completion in 50ms
}
// Завершена ли обработки RPC? Если - да, то проверяется размер
// изображения и выдается соответствующее сообщение пользователю.
// Если нет, назначается новая проверка через 50мсек.
function readResponse()
{
// Если изображение еще не загружено
if (!currentRequest.complete)
{
timer = setTimeout(readResponse, 50);
return;
}
// иначе изображение загружено, и его можно проверить
if (currentRequest.height == 1)
alert("User is not online");
else
alert("User is online");
timer = currentRequest = null;
}
// Проверка доступности пользователя. Если получен ответ,
// будет вызвана функция readResponse.
function isUserOnline(user)
{
var params = "user=" + user;
sendRPC(commandURL + params, readResponse);
return false;
}
</script>
<!-- Test Code -->
User: Smeagol (<a href="#" onclick="return isUserOnline('smeagol');">проверить
доступность</a>) [должно быть false] <br />
User: Deagol (<a href="#" onclick="return isUserOnline('deagol');">проверить
доступность</a>) [должно быть true]
</body>
</html>

В этом сценарии следует обратить внимание на то, что здесь учтены возможные задержки, поскольку изображение может загружаться медленно (из-за медленной работы сервера или низкой скорости сетевой связи). Поскольку обработка RPC-запроса (загрузка изображения) может задерживаться, функция callback запускается каждые 50 миллисекунд. При каждом запуске этой функции функция readResponse() проверяет свойство complete объекта Image, который используется для запроса. Как упоминалось в главе 15, указанное свойство устанавливается браузером, когда завершается загрузка изображения. Если значением complete является true, про-граммный код JavaScript читает ответ, представленный значением высоты изображения. Если значением complete является false, браузеру нужно больше времени, чтобы загрузить изображение, поэтому планируется вызвать readResponse() через 50 миллисекунд снова.

Типичной ошибкой программистов при использовании указанной техники двух-сторонней коммуникации в JavaScript является то, что они забывают учесть тот факт, что обработка RPC-запроса может занять больше времени, чем ожидается. Такие ситуации требуют "параноидального" подхода, и здесь полезным инструментом ока-зывается setTimeout(). Более совершенный подход к решению обсуждаемых здесь задач, основанный на использовании функций обратного вызова, будет рассмотрен в одном из следующих разделов главы.

Еще одной заслуживающей внимания особенностью предыдущего примера является то, что в каждый момент времени позволяется только один RPC-запрос. Если во время ожидания ответа на уже отправленный RPC-запрос наступает время отправки нового запроса, первый RPC-запрос отменяется и выдается второй. Такая политика немного упрощает программу, но и обработка множества одновременно выданных запросов не является слишком сложной задачей. Для этого требуется только аккуратный контроль трех вещей: ссылок на изображения, связанных с каждым RPC-запросом, функций, которые должны вызываться при завершении каждого RPC-запроса, и таймеров, используемых для периодической проверки завершения обработки каждого RPC-запроса.
назад:
далее:


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика