setTimeout是一个很好的解决scheme,使用JavaScript做asynchronous函数?

在网上search关于asynchronous函数,我发现许多使用setTimeout来完成这项工作的文章:

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

输出:

 first second 

这是有效的,但是最好的做法是?

谢谢

2 Solutions collect form web for “setTimeout是一个很好的解决scheme,使用JavaScript做asynchronous函数?”

setTimeout(function(){...}, 0)只需将当前调用堆栈执行完成后的代码运行即可。 这可能对某些事情有用 。

所以是的,它是asynchronous的,因为它打破了同步stream程,但实际上并不是在单独的线程上同时执行。 如果你的目标是后台处理,看看webworkers 。 还有一种使用iframe进行后台处理的方法。

更新

为了进一步阐明,并发/后台和asynchronous之间是有区别的。 当代码是asynchronous的,只是意味着它不是按顺序执行的。 考虑:

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

值“poo”将被警告,因为代码不是按顺序执行的。 “bar”值是asynchronous分配的。 如果您需要在发生asynchronous分配时提醒foo的值,请使用callback:

 /* contrived example alert */ var foo = 'poo'; function setFoo(callback) { setTimeout(function(){ foo = 'bar'; callback(); }, 100); }; setFoo(function() { alert(foo); }); 

所以是的,上面发生了一些asynchronous事件,但是这一切都发生在一个线程中,所以没有任何性能优势。

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

TLDR :所有后台/并发代码asynchronous发生,但不是所有asynchronous代码都同时发生。

另请参阅 : 以Layman的术语理解asynchronous代码

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

对@ tybro0103的答案进行了一个小的修正,“poo”的值不会被警告,因为代码不是按顺序执行的。 “bar”值是asynchronous分配的,只会在100毫秒后执行,届时警报将会被执行。

foo的价值保持不变。

  • 检查点击checkbox是否选中 - jQuery
  • 如何在对话框中closuresjQuery对话框?
  • 如何比较jQuery中的两个元素
  • 从开放的'fancybox'从functionclosures花式框
  • 使用jQuery构build一个带有参数的URL
  • 为Ajax设置超时(jQuery)
  • 将URL参数转换为JavaScript对象
  • jQuery在请求正文中发布有效的json
  • 检测页面是否有垂直滚动条?
  • 从YouTube取代url来embedded代码 - 错误:权限被拒绝访问属性'toString'
  • 如何从加载项轮询Google文档