Операции с индексированными транзакциями фиксируются, как только последний обратный вызов запускается, поэтому способ сохранить их в живых - это передать их через обратные вызовы.
Я просматриваю свою информацию о транзакции от Jonas Sicking, Mozilla dev и co-spec writer для IndexedDB, которые комментировали этот отличный пост в блоге , чтобы сказать следующее:
Следующее предложение неверно ». Сегодня транзакции, commit, когда переменная транзакции выходит за пределы области видимости и больше не может быть помещено против нее ».
Транзакция никогда автоматически не фиксируется, когда переменная выходит за пределы области видимости. Обычно они фиксируются только тогда, когда срабатывает последний обратный вызов успеха / ошибки, и этот обратный вызов не рассылает больше запросов. Таким образом, это не связано с объемом каких-либо переменных.
Единственное исключение - создание транзакции, но не обращение к ней. В этом случае транзакция «совершена» (независимо от того, что означает транзакцию, которая не имеет запросов), как только вы вернетесь в цикл событий. В этом случае вы можете технически «зафиксировать» транзакцию, как только все ссылки на нее выйдут из области видимости, но оптимизировать ее не рекомендуется.
blockquote>
Большая часть технологии апплета, включая JavaScript, осуществляет политику того-же-источника. Может быть возможно динамично добавить элементы DOM, такие как изображения, и собрать информацию синхронизации с помощью обработчика событий onLoad.
Psuedo-код
for (server in servers) {
var img = document.createElement('IMG');
server.startTime = getCurrentTimeInMS();
img.onload=function() { server.endTime = getcurrentTimeInMS(); }
img.src = server.imgUrl;
}
Затем ожидает подходящее время и проверяет синхронизацию на каждый серверный объект. Повторитесь по мере необходимости и вычислите средние числа, если Вы хотите. Я не уверен, какую точность можно ожидать.
Недостатки:
Если Вы говорите о выполнении чего-то сторона клиента, я не уверен, что это возможно из-за соображений безопасности.
, Возможно, Ваш лучший выбор был бы апплетом Java - но снова это должно быть проверено по политике локальной защиты.
, Если я пытаюсь думать о некотором взломе в JS, чтобы сделать это, возможно, можно попытаться отправить асинхронный запрос с функцией обратного вызова, которая измеряет миллисекунды, которые это взяло - но это просто первое, что пришло на ум.
Перед вызовом к серверу запишите время JavaScript:
var startTime = new Date();
Загрузка изображение с сервера:
var img = new Image()
img.onload = function() {
// record end time
}
img.src = "http://server1.domain.com/ping.jpg";
, Как только запрос закончен, запись время снова. (Данный, конечно, что запрос убрал не время.)
var endTime = new Date();
Ваш ping в миллисекундах:
var ping = endTime. getTime() - startTime.getTime();
Все, в чем Вы действительно нуждаетесь, является временем от соединения, запускаются, ко времени первого изменения readystate...
function getPing() { var start; var client = getClient(); // xmlhttprequest object client.onreadystatechange = function() { if (client.readyState > 0) { pingDone(start); //handle ping client.onreadystatechange = null; //remove handler } } start = new Date(); client.open("HEAD", "/ping.txt"); //static file client.send(); } function pingDone(start) { done = new Date(); ms = done.valueOf() - start.valueOf(); alert(ms + "ms ping time"); } function getClient() { if (window.XMLHttpRequest) return new XMLHttpRequest(); if (window.ActiveXObject) return new ActiveXObject('MSXML2.XMLHTTP.3.0'); throw("No XMLHttpRequest Object Available."); }
Проблема с 'ping файла' состоит в том, что Вы оценили бы http ответ сервера, тогда как Ваш целевой ресурс для игр, которым Вы служите, может иметь совсем другое поведение и таким образом другую задержку.
Просто идея внезапно, возможно, даже нереалистичный в зависимости от фактического контекста: но, не был бы это быть интересным сделать сценарий сервера на основе короткой последовательности задач обычно выполняемым серверами во время геймплея (например, открытие соединения RTMP, получая информацию, передавая его обратно). В зависимости от общего количества серверов Вы могли, почти открывая их одновременно и определять первый ответ как победителя (вычитающий время, которого Ваш клиент требует независимо для обработки каждого запроса).
, Конечно, это - довольно дорогой разговор стороны сервера метода, но по крайней мере Вы, надо надеяться, получили бы надежный результат (сервер и сетевые задержки, которым подводят итог). Даже если бы это берет пару секунд для оценки, это было бы вопросом части общего приятного геймплея.
.member = expression
.
– Michael Foukarakis
10 June 2011 в 11:08
Дело не в этом трудно для измерения времени отклика сервера в Flash.
Flash должен попросить файл политики прежде, чем получить доступ к удаленным серверам. Местоположение по умолчанию для такого файла политики в корневой папке сервера: /crossdomain.xml
(Можно легко найти информацию о междоменном формате файла)
Начиная с такого файла необходим так или иначе, почему бы не использовать его для измерения времени отклика сервера? Загрузите сам файл вместо изображения и измерьте время, он взял использование getTimer ().
Это даст Вам хорошую оценку на HTTP-соединениях.
, Но если Вы имеете дело с игровыми серверами, Вы могли бы хотеть непосредственно проверить скорость соединения TCP. Чтобы сделать это, необходимо будет использовать flash.net. Сокет необходимо будет также попросить файл политики сначала путем выполнения: Security.loadPolicyFile ("xmlsocket://сервер domain.com:5342");
, Где 5342 представляет номер порта Вашего сервера, где он должен ответить надлежащей строкой политики XML. После создания сокетного соединения любой запрос/ответ позволит Вам измерить различное время отклика сервера.
Вот <iframe>
подход:
(источник: magnetiq.com )
Составляют таблицу (не обязательно в литерале <table>
смысл) с двумя столбцами. Первый столбец будет содержать название серверов (и возможно связывается с ними). Второй столбец имеет iframes, которые загружают тестовые документы из соответствующих серверов. Каждый тестовый документ делает это по начальному запросу выборки:
Вы использовали бы iframes, не нарушая ту-же-доменную-политику, потому что нет никакой попытки управления iframe содержанием вообще. Игрок будет просто видеть значения его собственными глазами, и Вы будете полагаться на пользователя, глядящего на числа и нажимающего на ссылку сервера, которая имеет большую часть смысла.
Следует иметь в виду, что задержка будет по крайней мере дважды, какого Вы видели бы ping, если Вы заканчиваете тем, что делали запрос TCP для измерения задержки, потому что Вам будут нужны трехэтапное квитирование и пакет завершения в минимуме (два распространения в прямом и обратном направлениях, а не одно). При создании Запросов HTTP попытайтесь свести заголовки к минимуму. Достаточно длинный заголовок (из-за болтливого сервера или cookie и т.д. на клиенте) может добавить дополнительные распространения в прямом и обратном направлениях в соединение, отбросив Ваши измерения.