2013-10-28 38 views
38

约异步功能的网页搜索,我发现使用的setTimeout做这个工作的许多文章:setTimeout是一个很好的解决方案,用javascript做异步函数?

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

输出:

first 
second 

这工作,但它是一个最好的做法?

感谢

+2

这当然是最简单的技术。但是,如果您实际尝试在单独的线程中运行异步任务,[web workers](https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers)更有效。(HTML 5) –

+2

@minitech:这正是我的观点('setTimeout'运行在一个单独的线程中,而Web工作者则不会)。他们服务于不同的目的,并且当网络工作者真正在寻找他们时,人们经常使用'setTimeout'。在不知道OP要完成的更多细节的情况下,我不确定哪种方法最适合这种情况。 –

+1

练习?不要管那个。你的目标是什么?告诉我们,然后我们可以帮助您最好地实现它。 –

回答

48

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

+0

正确的语法 - > var foo ='poo'; setTimeout(function(){ foo ='bar'; callback(); },100);函数setFoo(callback) }; setFoo(function(){ alert(foo); }); – Siddharth

+0

@Siddharth很好的捕捉;更新。 – tybro0103

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

小校正@ tybro0103的回答值‘大便’不会被警告。 'bar'值是异步分配的,它只会在100毫秒后执行,届时警报将被执行。

foo的值保持未变。

+1

*您的意思是'bar'的值不会被警告,因为'alert'已经触发了'foo' – Paul

+0

是的,您可以通过在控制台上执行相同的操作来轻松验证它。 –

+0

我将setTimeout(..)中的数字值更改为0.原来它仍然打印'poo',即数值没有改变。你能解释一下为什么? –

相关问题