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

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

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

Выход:

first
second

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

Ответ 1

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

Так что да, он асинхронный в том смысле, что он прерывает синхронный поток, но на самом деле он не собирается выполняться одновременно/в отдельном потоке. Если ваша цель - фоновая обработка, взгляните на веб-работников. Также есть способ использовать iframes для фоновой обработки.

Обновление:

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

var foo='poo';
setTimeout(function() {
  foo='bar'
}, 100);
console.log(foo);

Ответ 2

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

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

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

Ответ 3

По умолчанию JavaScript является асинхронным всякий раз, когда он сталкивается с асинхронной функцией, он ставит эту функцию в очередь на потом. Но если вам нужна пауза js, вы можете сделать это с помощью обещаний. Случай 1: вывод привет (не будет ждать setTimeout) https://jsfiddle.net/shashankgpt270/h0vr53qy/

//async 
function myFunction() {
let result1='hello'
//promise =new Promise((resolve,reject)=>{
setTimeout(function(){ 
resolve("done");
result1="done1";
}, 3000);
//});
 //result = await promise
 alert(result1);
}
myFunction();

Вариант 2: выходной файл done1 (будет ожидать setTimeout) https://jsfiddle.net/shashankgpt270/1o79fudt/

async function myFunction() {
let result1='hello'
promise =new Promise((resolve,reject)=>{
setTimeout(function(){ 
resolve("done");
result1="done1";
}, 3000);
});
 result = await promise
 alert(result1);
}
myFunction();