我刚刚开始学习异步JavaScript,所以我不确定这是否是一个愚蠢的问题,但我无法直接找到答案。
在异步JS的示例中,我看到异步逻辑总是在同步逻辑之后调用,也就是说最后一个。像这样:
function1() {}
asynchronousFunction(){}
function2(){}
这不等同于:
function1(){}
function2(){}
function3(){} //asynchronous function
异步调用不是与主线程堆栈顶部的函数调用相同吗,因为异步调用似乎总是在任何同步之后进行?
感谢您对此的任何帮助!
JS中的异步函数用于执行需要时间的操作,例如下载一些数据或计算某些内容。当然,你可以同步进行,但你的视图会冻结,没有人想要这样。
异步函数在所有同步后运行是不正确的。(它像正常的同步功能一样开始,但在"任务"完成时结束。
更多: 链接
您还应该阅读有关 AJAX 的更多信息。
Javascript async
函数最初是一个同步函数,但在如何解决方面与常规函数不同。
Javascript 是单线程的,也就是说,它一次只能专注于一件事。它通过具有 promises
来弥补这一点,这是构建异步函数的主要概念。当调用异步函数时,它会创建一个承诺,它只是说,"嘿,一旦foo
完成,我将稍后回调它。因此,异步函数在移动到下一个函数之前确实完成了,但不同之处在于它现在只知道它稍后需要返回。
异步函数似乎总是在所有同步函数之后完成的原因是,嗯,它确实如此。承诺总是在当前代码运行之后调用,因为同样,Javascript 只能在单个线程上运行。
您可以在此处阅读有关promises
的更多信息。
同步调用逐行发生。当同步行的先前函数全部调用和执行时,将调用同步行。
javascript 中的异步调用在调用之前等待某个事件发生。它计划将来在特定事件发生时调用的方法。
请注意,异步与并发或多线程的含义不同。JavaScript 可以有异步代码,但它通常是单线程的。
阅读更多
这是通过称为事件循环的东西实现的。
请考虑以下代码片段。
console.log("1");
setTimeout(() => {
console.log("2");
},0);
console.log("3");
输出为
1
3
2
这是因为第 2 行是异步方法调用。此方法被添加到称为事件循环的队列中,然后在将来计时器结束时或调用堆栈为空时取消排队。