Является ли setTimeout хорошим решением для создания асинхронных функций с помощью javascript?

Поиск в Интернете об асинхронных функциях я нашел много статей, использующих setTimeout для выполнения этой работы:

window.setTimeout(function() { console.log("second"); }, 0); console.log("first"); 

Вывод:

 first second 

Это работает, но это лучшая практика?

setTimeout(function(){...}, 0) просто ставит в очередь код для запуска после завершения выполнения текущего стека вызовов. Это может быть полезно для некоторых вещей .

Так что да, это асинхронно, поскольку он прерывает синхронный stream, но на самом деле он не будет выполняться одновременно / в отдельном streamе. Если ваша цель – фоновая обработка, посмотрите на веб-мастеров . Существует также способ использования iframe для фоновой обработки.

Обновление :

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

 var foo = 'poo'; setTimeout(function() {foo = 'bar'}, 100); alert(foo); 

Значение «poo» будет предупреждено, потому что код не выполнялся последовательно. Значение «bar» было назначено асинхронно. Если вам нужно предупредить значение foo при возникновении асинхронного назначения, используйте обратные вызовы:

 /* contrived example alert */ var foo = 'poo'; function setFoo(callback) { setTimeout(function(){ foo = 'bar'; callback(); }, 100); }; setFoo(function() { alert(foo); }); 

Так что да, есть асинхронная работа, которая происходит выше, но все происходит в одном streamе, поэтому нет преимуществ по производительности.

Когда операция занимает много времени, лучше всего сделать это в фоновом режиме. В большинстве языков это выполняется путем выполнения операции над новым streamом или процессом. В (браузере) javascript у нас нет возможности создавать новые streamи, но можно использовать webworkers или iframes. Поскольку этот код, работающий в фоновом режиме, прерывает последовательный stream вещей, он асинхронен.

TLDR : весь фоновый / параллельный код происходит асинхронно, но не все асинхронные коды происходят одновременно.

См. Также : Понимание асинхронного кода в терминах Layman

 var foo = 'poo'; setTimeout(function() {foo = 'bar'}, 100); alert(foo); 

Небольшая поправка к ответу @ tybro0103, во время выполнения «alert (foo)» значение «poo» не изменится, потому что код не выполнялся последовательно. Значение «bar» было назначено асинхронно, и оно будет исполнено только через 100 миллисекунд, к тому времени будет выполнено предупреждение.

Значение foo остается неизменным во время выполнения строкового предупреждения (foo) . И изменится позже по времени. Проверьте комментарий @ vishal-lia.

  • jQuery Прокрутка вниз страницы / iframe
  • json Uncaught SyntaxError: Неожиданный токен:
  • Как работает jQuery .data ()?
  • Ошибка: нечистить SyntaxError: Неожиданный токен <
  • Оберните каждые 3 divs в div
  • Импорт jQuery в Joomla
  • Веб-рабочий HTML и вызов JQuery Ajax
  • Внедрение jQuery DatePicker в Bootstrap modal
  • jQuery: первый против .first ()
  • Как создать thead и tbody в таблице ASP.NET?
  • проверка нескольких текстовых полей с одинаковым именем с помощью jquery validator проверяет только первый ввод
  • Давайте будем гением компьютера.