在网上搜索有关异步函数的信息,我发现很多文章使用 setTimeout 来完成这项工作:
window.setTimeout(function() {
console.log("second");
}, 0);
console.log("first");
Output:
first
second
这可行,但这是最佳实践吗?
setTimeout(function(){...}, 0)
只需将代码排队等待当前调用堆栈执行完毕即可运行。这可以是对某些事情有用.
所以是的,它是异步的,因为它破坏了同步流程,但它实际上不会同时/在单独的线程上执行。如果您的目标是后台处理,请查看网络工作者。还有一种使用 iframe 进行后台处理的方法。
Update:
为了进一步澄清,并发/后台和异步之间存在差异。当代码是异步的时,这仅仅意味着它不是按顺序执行的。考虑:
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:所有后台/并发代码都是异步发生的,但并非所有异步代码都是同时发生的。
See Also: 用外行术语理解异步代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)