setTimeout是使用javascript执行异步函数的好解决方案吗?

setTimeout是使用javascript执行异步函数的好解决方案吗?,javascript,jquery,Javascript,Jquery,在网上搜索有关异步函数的内容时,我发现许多文章都使用setTimeout来完成这项工作: window.setTimeout(function() { console.log("second"); }, 0); console.log("first"); 输出: first second 这是可行的,但却是最佳实践?setTimeout(function(){…},0)只需在当前调用堆栈完成执行后将要运行的代码排队。这可以是 是的,它是异步的,因为它破坏了同步流,但实际上它不会在单独的

在网上搜索有关异步函数的内容时,我发现许多文章都使用setTimeout来完成这项工作:

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

first
second
这是可行的,但却是最佳实践?

setTimeout(function(){…},0)只需在当前调用堆栈完成执行后将要运行的代码排队。这可以是

是的,它是异步的,因为它破坏了同步流,但实际上它不会在单独的线程上并发执行。如果您的目标是后台处理,请查看。还有一种方法可以使用iframe进行后台处理

更新

为了进一步澄清,并发/后台处理和异步处理之间存在差异。当代码是异步的,这意味着它不是按顺序执行的。考虑:

var foo='poo';
setTimeout(函数(){
foo='bar'
}, 100);
console.log(foo)
对@tybro0103的答案进行一个小的更正,在执行“警报(foo)”期间,值“poo”不会改变,因为代码不是按顺序执行的。“bar”值是异步分配的,它将仅在100毫秒后执行,届时将执行警报


foo的值保持不变,在执行line alert(foo)期间。以后会有变化。检查@vishal lia comment。

默认情况下,JavaScript在遇到异步函数时是异步的,它将该函数排队等待以后使用。 但是如果你想暂停,你可以使用承诺 案例1:输出hello(不会等待setTimeout)

案例2:输出done1(将等待setTimeout)


这当然是最简单的技术。但是,如果您实际上试图在单独的线程中运行异步任务,则更有效。(HTML5)@minitech:这正是我的观点(即
setTimeout
在一个线程中运行,而web工作人员不运行)。它们有不同的用途,当web工作人员真正需要时,人们通常使用
setTimeout
。在不知道OP想要完成的更多细节的情况下,我不确定哪一个最适合这个案例。实践?别担心。你的目标是什么?告诉我们,然后我们可以帮助你最好地实现它。@flightodysey:噢。我不太明白“更有效”的意思PAsync不会有更好的性能。你只是在拖延即将发生的事情。如果您的代码在写入之前需要等待,那么请务必保留它。*您的意思是不会对值“bar”发出警报,因为
alert
已触发
foo
是正确的,您可以通过在控制台上执行相同的命令轻松验证它。我将setTimeout(..)中的数值更改为0。结果它仍然打印“poo”,即值没有改变。请您解释一下原因好吗?@VaisakhRajagopal ok得到了它,因此setTimeout函数在当前堆栈完成后加上指定的毫秒数(而不仅仅是指定的毫秒数)运行。谢谢当你说“foo的价值不变”时,你实际上是在迷惑人们。foo肯定会更改为'bar',但在100毫秒后,如果您记录'foo',它仍然会打印'poo',因为在100毫秒后调用了“function(){foo='bar'}”。您可以在浏览器控制台中进行验证以检查值的更改。如果您已经在编写异步,那么有一种非常方便的方法使其可读:
函数休眠(延迟){return new Promise(resolve=>setTimeout(resolve,delay));}
-然后您就可以轻松地
等待休眠(2000)异步
函数中的代码>内联
var foo = 'poo';
setTimeout(function() {foo = 'bar'}, 100);
alert(foo);
//async 
function myFunction() {
let result1='hello'
//promise =new Promise((resolve,reject)=>{
setTimeout(function(){ 
resolve("done");
result1="done1";
}, 3000);
//});
 //result = await promise
 alert(result1);
}
myFunction();
async function myFunction() {
let result1='hello'
promise =new Promise((resolve,reject)=>{
setTimeout(function(){ 
resolve("done");
result1="done1";
}, 3000);
});
 result = await promise
 alert(result1);
}
myFunction();