Является ли 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();