Сначала прочитайте - Из-за повторяющихся вопросов, почему это должно работать, позвольте мне немного уточнить.
- Клиентская функция обратного вызова выполняется на клиенте, , поэтому он имеет доступ к закрытию, включая переменную
start
, содержащую метку времени. Это аргумент ack () в socket.io.
- Сервер, естественно, не может вызвать произвольную функцию на клиенте и получить доступ к закрытию функции. Но
socket.io
позволяет определить функцию обратного вызова, которая, по-видимому, выполняется сервером , но на самом деле это просто передает аргументы функции через веб-сокет, и клиент затем вызывает обратный вызов.
Что происходит ниже (проверьте код примера!):
- Клиент сохраняет текущую метку времени
1453213686429
в start
- Клиент отправляет на сервер событие
ping
и ожидает ответа
- Сервер отвечает на событие ping «Пожалуйста, перезвоните с пустыми аргументами».
- Клиент получает ответ и вызывает
clientCallback
с пустыми аргументами (проверьте демонстрационный код, если хотите увидеть аргументы)
clientCallback
снова принимает текущую метку времени на клиенте , например 1453213686449
и знает, что 20 ms
прошло с момента отправки запроса.
Представьте себе друида (клиент) , держащего секундомер и нажимающего кнопку, когда мессенджер (событие) начинает работать, и нажимающего его снова, когда мессенджер прибывает со своим свитком (аргументы функции) . Затем друид читает свиток и добавляет названия ингредиентов в свой рецепт зелья и заваривает зелье. (обратный вызов)
Хорошо, забудьте предыдущий абзац, я думаю, вы поняли.
Хотя на вопрос уже дан ответ, здесь короткая реализация для проверки RTT с помощью socket.io
:
Клиент
var start = Date.now();
this.socket.emit( 'ping', function clientCallback() {
console.log( 'Websocket RTT: ' + (Date.now() - start) + ' ms' );
} );
Сервер
socket.on( 'ping', function ( fn ) {
fn(); // Simply execute the callback on the client
} );
Демо-код
Демонстрационный код в качестве модуля узла: socketIO-callback.tgz Установите его и запустите с помощью
npm install
node callback.js
и затем перейдите к http://localhost:5060