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

标签 javascript jquery

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

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

输出:

first
second

这可行,但这是最佳实践吗?

最佳答案

setTimeout(function(){...}, 0) 只是将代码排队,以便在当前调用堆栈执行完毕后运行。这可以是 useful for some things .

是的,它是异步的,因为它打破了同步流程,但它实际上不会并发执行/在单独的线程上执行。如果您的目标是后台处理,请查看 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:所有后台/并发代码都是异步发生的,但并非所有异步代码都是同时发生的。

另请参阅:Understanding Asynchronous Code in Layman's terms

关于javascript - setTimeout 是使用 javascript 执行异步函数的好解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19626680/

相关文章:

javascript - 使用随机元素名称自动填充文本区域的书签

jQuery,尝试在 x 秒后删除隐藏的 div?

jquery - 通过 jquery 查找深度嵌套的输入

jquery - 将所有具有只读属性的输入更改为禁用,而不是使用 jQuery

javascript - 使用 JS 操作对象

javascript - 如何使用嵌套在标签类 ="..."中的 input type = checkbox 在背景图像之间切换?

javascript - 增加节点大小 vis.js

javascript - 从有谷歌地图的地方获取纬度和经纬度

JavaScript - isNaN 的反义词是什么?

jquery - 如何在文档加载时使用 jquery 在选择框中选择特定项目