Как заставить ваши функции «спать» на JavaScript

JavaScript не имеет встроенной/нативной функции сна, но благодаря введению обещаний (и async/await в ES2018) мы можем реализовать такие функции очевидным и точным образом, чтобы ваши функции спали.

JavaScript sleep

Чтобы ваши функции спали в JavaScript, используйте комбинацию setTimeout () и Promise, чтобы отложить выполнение вашей функции. выполнение вашим намеренным способом.

Синтаксис

 const sleep = (миллисекунды) => {return new Promise (resolve =>  setTimeout (resolve, milliseconds))} 

В этом примере мы создаем функцию sleep (), которая принимает в качестве параметра миллисекунды .

Функция сна создаст новое обещание, которое разрешится за заданные миллисекунды, так что до этого выполнение будет приостановлено. После разрешения он продолжит выполнение.

Пример

//app.jsconst sleep = (milliseconds) => {return new Promise (resolve => setTimeout (resolve, milliseconds))} const list = [1, 2, 3, 4, 5] const  задача = async () => {для (константный элемент списка) {ждать сна (1000);  console.log ('Yello, D ' ой ');  }} task (); 

В этом примере сначала мы определили функцию сна. Мы будем вызывать функцию sleep (), когда нам нужно «засыпать» конкретную функцию.

Теперь в нашем коде этой конкретной функцией является задача task (). Итак, мы будем использовать функцию sleep () в функции task () для сна.

Здесь мы использовали async-await, потому что sleep () вернет обещание. Слово « async» перед функцией означает одну простую вещь: функция всегда возвращает обещание. 2. Ключевое слово « await» заставляет JavaScript ждать, пока это обещание не будет выполнено, и вернет свой результат.

Мы определили список массивов, который может быть полезен для создания цикла .

Функция task () записывает значения Yello, D’oh одно за другим с интервалом в 1 секунду. Итак, на одну секунду функция переходит в спящий режим, и после того, как обещание будет разрешено, она в следующий раз запишет ту же строку, а затем снова перейдет в спящий режим на 1 секунду и так далее.

Вывод

 Yello, D'ohYello, D'ohYello, D'ohYello, D'oh 

Приведенные выше операторы будут регистрироваться один за другим после 1-секундной задержки.

Если вы не хотите определять sleep (), то вы можете добиться этого, используя одну строку кода.

//app.jsconst list = [1, 2, 3, 4] const task = async () =>  {for (элемент const списка) {ждать нового обещания (r => setTimeout (r, 2000));  console.log ('Yello, D ' ой ');  }} task (); 

Здесь мы только что добавили следующую строку кода.

//app. jsawait new Promise (r => setTimeout (r, 2000)); 

Помните, что из-за того, как работает JavaScript (подробнее о цикле событий), это не приостанавливает выполнение всей программы, поскольку может произойти на других языках, но вместо этого спит только ваша функция.

Чтобы продемонстрировать, что она не приостанавливается, давайте добавим одну простую строку кода в приведенный выше код.

//app.jsconst sleep = (milliseconds) => {return new Promise (resolve => setTimeout (resolve, milliseconds))} const list = [1, 2, 3, 4] const task = async () =  > {for (элемент const списка) {ожидание нового обещания (r => setTimeout (r, 2000));  console.log ('Yello, D ' ой ');  }} task (); console.log ('Done!') 

Здесь мы добавили последнюю строку, в которой регистрируется Done !. Это означает, что после завершения функции task () механизм Javascript должен напечатать Done !.

Теперь давайте запустим приведенный выше код и посмотрим на результат.

 Готово! Yello, D'ohYello, D'ohYello, D'ohYello,  D'oh 

Вы видите проблему, и Done регистрируется первым, даже если мы написали последнее. Это способ обработки асинхронного кода в JavaScript. Это связано с тем, что регистрация операторов здесь является асинхронной операцией в JavaScript.

Когда интерпретатор JavaScript встречает асинхронную функцию, он не будет ждать завершения запроса. Скорее, он продолжит свой путь и запишет вывод «Готово!» на консоль, и когда запрос вернет пару сотен миллисекунд позже, он будет выводить операторы один за другим.

Проблема здесь в том, что JavaScript — это язык однопоточных моделей, основанный на событиях. . Хотя в конкретном случае было бы неплохо, если бы весь движок подождал несколько секунд, в целом это плохая практика. Но опять же, это полностью зависит от того, чего вы пытаетесь достичь и от того, насколько эффективно работает приложение.

Предостережения относительно сна в JavaScript

Печально известный сон, или задержка, метод на любом языке всегда обсуждается. Некоторые разработчики скажут, что всегда должен быть сигнал или обратный вызов для запуска данной функции; другие разработчики будут утверждать, что иногда бывает полезен произвольный момент задержки. Но я считаю, что у каждого свое, и одно правило никогда ничего не решит в этой отрасли. Он полностью основан на ваших потребностях и требованиях.

Метод setTimeout () не задерживает выполнение, он выполняет следующую строку метода сразу после того, как тайм-аут установлен, а не после истечения тайм-аута , так что это не позволяет решить ту же задачу, что и метод сна.

Заключение

Спящий режим JavaScript — спорная концепция . Из-за природы однопоточного языка мы не можем достичь полной функциональности сна, как это сделали другие языки. Но иногда в некоторых случаях может оказаться полезным указанное выше решение.

Проблемы с синхронизацией в JavaScript могут вызвать у разработчиков головную боль.. То, как вы с ними справляетесь, полностью зависит от того, чего вы пытаетесь достичь.

Это все для примера функции сна JavaScript.

Оцените статью
nanomode.ru
Добавить комментарий