vin*_*dev 52 javascript jquery
在网上搜索异步函数,我发现很多文章使用setTimeout来完成这项工作:
window.setTimeout(function() {
console.log("second");
}, 0);
console.log("first");
Run Code Online (Sandbox Code Playgroud)
输出:
first
second
Run Code Online (Sandbox Code Playgroud)
这有效,但是最佳做法?
tyb*_*103 67
setTimeout(function(){...}, 0)
只需将代码排队,即可在当前调用堆栈执行完毕后运行.这对某些事情很有用.
所以是的,它是异步的,因为它打破了同步流,但它实际上不会在一个单独的线程上同时/执行.如果您的目标是后台处理,请查看webworkers.还有一种方法可以使用iframe进行后台处理.
更新:
为了进一步说明,并发/后台和异步之间存在差异.当代码是异步的时,这意味着它不是按顺序执行的.考虑:
var foo='poo';
setTimeout(function() {
foo='bar'
}, 100);
console.log(foo);
Run Code Online (Sandbox Code Playgroud)
值'poo'将被警告,因为代码没有按顺序执行.'bar'值是异步分配的.如果需要警告foo
异步分配何时发生的值,请使用回调:
/* contrived example alert */
var foo = 'poo';
function setFoo(callback) {
setTimeout(function() {
foo = 'bar';
callback();
}, 100);
};
setFoo(function() {
console.log(foo);
});
Run Code Online (Sandbox Code Playgroud)
所以是的,上面发生了一些异步现象,但这一切都发生在一个线程中,因此没有性能优势.
当操作需要很长时间时,最好在后台执行.在大多数语言中,这是通过在新线程或进程上执行操作来完成的.在(浏览器)javascript中,我们无法创建新线程,但可以使用webworkers或iframe.由于此代码在后台运行会破坏事物的顺序流,因此它是异步的.
TLDR:所有后台/并发代码都是异步发生的,但并非所有异步代码都同时发生.
另请参阅:了解Layman术语中的异步代码
归档时间: |
|
查看次数: |
54114 次 |
最近记录: |