setTimeout 是使用 javascript 执行异步函数的好解决方案吗?
Is setTimeout a good solution to do async functions with javascript?
搜索有关异步函数的信息,我发现许多使用setTimeout来完成这项工作的文章:
window.setTimeout(function() {
console.log("second");
}, 0);
console.log("first");
输出:
first
second
这有效,但这是最佳实践吗?
setTimeout(function(){...}, 0)
只是将代码排队,以便在当前调用堆栈完成执行后运行。这对于某些事情很有用。
所以是的,它是异步的,因为它会中断同步流,但它实际上不会同时/在单独的线程上执行。如果您的目标是后台处理,请查看 Web 工作者。还有一种方法可以使用 iframe 进行后台处理。
更新:
为了进一步澄清,并发/后台和异步性之间存在差异。当代码是异步的时,这仅意味着它不会按顺序执行。考虑:
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:所有后台/并发代码都是异步发生的,但并非所有异步代码都是并发发生的。
另请参阅:用外行术语理解异步代码
默认情况下,JavaScript 在遇到异步函数时都是异步的,它会将该函数排队等待以后使用。但是如果你想要暂停js,你可以使用承诺情况1:输出问候(不会等待设置超时)https://jsfiddle.net/shashankgpt270/h0vr53qy/
//async
function myFunction() {
let result1='hello'
//promise =new Promise((resolve,reject)=>{
setTimeout(function(){
resolve("done");
result1="done1";
}, 3000);
//});
//result = await promise
alert(result1);
}
myFunction();
情况 2:输出完成1(将等待设置超时)https://jsfiddle.net/shashankgpt270/1o79fudt/
async function myFunction() {
let result1='hello'
promise =new Promise((resolve,reject)=>{
setTimeout(function(){
resolve("done");
result1="done1";
}, 3000);
});
result = await promise
alert(result1);
}
myFunction();
var foo = 'poo';
setTimeout(function() {foo = 'bar'}, 100);
alert(foo);
对@tybro0103答案的一个小更正,在执行"alert(foo)"期间,值"poo"不会改变,因为代码没有按顺序执行。"bar"值是异步分配的,它只会在 100 毫秒后执行,届时将执行警报。
foo的值在执行行警报(foo)期间保持不变。并且稍后会按时更改。查看@vishal-lia 注释。
- TypeError:$(..).higharts不是函数-现有解决方案不起作用-Yeoman生成器存在问题
- setTimeout 是使用 javascript 执行异步函数的好解决方案吗?
- 递归函数 - 计数如何存储在此阶乘解决方案中
- 如何为此 jquery 代码使用函数参数,或者是否有更好的解决方案
- 寻找一个纯粹的Javascript函数式编程解决方案
- 未捕获的类型错误: $(..).froala编辑器不是一个函数//解决方案被找到,但不确定如何使用它
- 改进这个自定义函数addClassIfVarDefined()或共享更好的解决方案
- 实现回调函数的自定义解决方案
- javascript jquery函数触发解决方案
- 什么's在javascript回调函数中使用blade的解决方案
- 添加另一个jQuery函数到AJAX调用或CSS解决方案
- 如何在ES6中分离Jsx内部渲染函数到一个单独的文件?或任何其他解决方案,以分离逻辑和表示
- 需要优化的解决方案,不使用jquery函数
- 为什么我的VowelCount函数没有返回正确的解决方案
- 解决方案文档.write函数
- 时间函数,找到更好的解决方案
- 使用jquery/ajax调用同一解决方案中另一个项目中的c#(或任何其他.net)函数
- 是否有任何解决方案来结束一个无限循环函数
- 将数组而不是字符串传递给函数以上传文件(node.js)的解决方案
- Jquery解决方案/ javascript函数分配变量