Объяснение фрагмента кода Socket.io (JavaScript setTimeout и function.apply)Javascript

Форум по Javascript
Ответить
Anonymous
 Объяснение фрагмента кода Socket.io (JavaScript setTimeout и function.apply)

Сообщение Anonymous »

У меня есть два вопроса относительно следующего фрагмента кода Socket.io:

Код: Выделить всё

const withTimeout = (onSuccess, onTimeout, timeout) => {
let called = false;

const timer = setTimeout(() => {
if (called) return;
called = true;
onTimeout();
}, timeout);

return (...args) => {
if (called) return;
called = true;
clearTimeout(timer);
onSuccess.apply(this, args);
};
}

socket.emit("hello", 1, 2, withTimeout(() => {
console.log("success!");
}, () => {
console.log("timeout!");
}, 1000));

Вопрос 1: withTimeout возвращает обратный вызов, который мы (сервер) передаем клиенту. Если клиент не вызывает созданный обратный вызов до истечения таймера, мы должны получить «тайм-аут», напечатанный на нашей (серверной) консоли, верно? В конце концов, клиент вызовет наш обратный вызов, но «успех» никогда не выводится, поскольку клиент проиграл гонку. Мой вопрос: почему нам не нужно вызыватьclearTimeout(timer), а мгновенно возвращать (из-за if (calzed) return;)? Мы вызываемclearTimeout только в том случае, если клиент выигрывает гонку, но не когда клиент проигрывает гонку. Не будет ли «таймаут» печататься каждый таймаут миллисекунды? Или это происходит только до тех пор, пока клиент не вызывает обратный вызов, но когда обратный вызов вызывается нашим клиентом, область видимости все равно уничтожается (функция Socket.emit завершает выполнение), и, следовательно, наш таймер также уничтожается?
Вопрос 2. Что дает onSuccess.apply(this, args);? Почему бы просто не вызвать onSuccess(args) прямо здесь? Это из-за того, где должен происходить console.log (с помощью onSuccess.apply(this, args);, записывающего его на консоль сервера, и onSuccess(args), записывающего его на консоль клиента) ?
Я должен признать, что это своего рода базовые концептуальные вопросы JS, но я никогда не сталкивался с ними на практике (я помню их только из книги, которую прочитал некоторое время назад), чтобы полностью понять их до тех пор (надеюсь) сейчас

Подробнее здесь: https://stackoverflow.com/questions/793 ... tion-apply
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»