约异步功能的网页搜索,我发现使用的setTimeout做这个工作的许多文章:setTimeout是一个很好的解决方案,用javascript做异步函数?
window.setTimeout(function() {
console.log("second");
}, 0);
console.log("first");
输出:
first
second
这工作,但它是一个最好的做法?
感谢
约异步功能的网页搜索,我发现使用的setTimeout做这个工作的许多文章:setTimeout是一个很好的解决方案,用javascript做异步函数?
window.setTimeout(function() {
console.log("second");
}, 0);
console.log("first");
输出:
first
second
这工作,但它是一个最好的做法?
感谢
setTimeout(function(){...}, 0)
只需排队一次代码当前调用堆栈执行完毕运行。这可以是useful for some things。
所以是的,它是异步的,因为它打破了同步流程,但它并不会在单独的线程上同时执行。如果您的目标是后台处理,请查看webworkers。还有一种使用iframe进行后台处理的方法。
更新:
为了进一步澄清,有并发/ backgrounding和异步岬之间的差。当代码是异步的,只是意味着它不是按顺序执行的。考虑:
var foo = 'poo';
setTimeout(function() {foo = 'bar'}, 100);
alert(foo);
值'poo'将被警告,因为代码没有按顺序执行。 'bar'值是异步分配的。如果您需要提醒的foo
值时异步分配情况,使用回调:
/* contrived example alert */
var foo = 'poo';
function setFoo(callback) {
setTimeout(function(){
foo = 'bar';
callback();
}, 100);
};
setFoo(function() {
alert(foo);
});
所以,是的,有一些异步的烦躁上面发生的事情,但这样就没有性能优势这一切都在一个线程中发生的事情。
当一个操作需要很长时间时,最好在后台执行。在大多数语言中,这是通过在新线程或进程上执行操作来完成的。在(浏览器)javascript中,我们无法创建新线程,但可以使用webworkers或iframe。由于在后台运行的代码会破坏事件的顺序流,所以它是异步的。
TLDR:所有后台/并发代码异步发生,但并非所有异步代码都同时发生。
另外请参见:因为代码没有被顺序地执行Understanding Asynchronous Code in Layman's terms
var foo = 'poo';
setTimeout(function() {foo = 'bar'}, 100);
alert(foo);
小校正@ tybro0103的回答值‘大便’不会被警告。 'bar'值是异步分配的,它只会在100毫秒后执行,届时警报将被执行。
foo的值保持未变。
*您的意思是'bar'的值不会被警告,因为'alert'已经触发了'foo' – Paul
是的,您可以通过在控制台上执行相同的操作来轻松验证它。 –
我将setTimeout(..)中的数字值更改为0.原来它仍然打印'poo',即数值没有改变。你能解释一下为什么? –
这当然是最简单的技术。但是,如果您实际尝试在单独的线程中运行异步任务,[web workers](https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers)更有效。(HTML 5) –
@minitech:这正是我的观点('setTimeout'运行在一个单独的线程中,而Web工作者则不会)。他们服务于不同的目的,并且当网络工作者真正在寻找他们时,人们经常使用'setTimeout'。在不知道OP要完成的更多细节的情况下,我不确定哪种方法最适合这种情况。 –
练习?不要管那个。你的目标是什么?告诉我们,然后我们可以帮助您最好地实现它。 –