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

新手上路,请多包涵

在网上搜索异步函数,我发现很多文章都使用 setTimeout 来完成这项工作:

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

输出:

 first
second

这行得通,但这是最佳做法吗?

原文由 viniciuswebdev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

setTimeout(function(){...}, 0) 只是将代码排队,以便在当前调用堆栈执行完毕后运行。这 对某些事情很有用

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

更新

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

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

值 ‘poo’ 将被警告,因为代码没有按顺序执行。 ‘bar’ 值是异步分配的。如果您需要在异步分配发生时提醒 foo 的值,请使用回调:

 /* contrived example alert */
var foo = 'poo';

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

所以是的,上面发生了一些异步性,但它全部发生在一个线程中,因此没有性能优势。

当一个操作需要很长时间时,最好在后台进行。在大多数语言中,这是通过在新线程或进程上执行操作来完成的。在(浏览器)javascript 中,我们没有创建新线程的能力,但可以使用 webworkers 或 iframe。由于这段在后台运行的代码打破了事物的顺序流,因此它是异步的。

TLDR :所有后台/并发代码都是异步发生的,但并非所有异步代码都是同时发生的。

另请参阅通俗理解异步代码

原文由 tybro0103 发布,翻译遵循 CC BY-SA 4.0 许可协议

默认情况下,JavaScript 在遇到异步函数时是异步的,它会将该函数排队等待稍后使用。但是如果你想要暂停 js,你可以使用 promises 案例 1:输出 hello(不会等待 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();

原文由 Shashank Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题