0

我刚刚开始学习异步 JavaScript,所以我不确定这是否是一个愚蠢的问题,但我无法直接找到答案。

在异步 JS 的示例中,我看到异步逻辑总是在同步逻辑之后调用,也就是说最后。就像是:

function1() {}

asynchronousFunction(){}

function2(){}

这不相当于:

function1(){}

function2(){}

function3(){} //asynchronous function

异步调用是否与主线程堆栈顶部的函数调用相同,因为异步调用似乎总是在任何同步之后进行?

感谢您对此的任何帮助!

4

3 回答 3

1

Javascriptasync函数以同步函数开始,但与常规函数的不同之处在于它的设置方式。

Javascript 是单线程的——也就是说,它一次只能专注于一件事情。它通过 have 来弥补这一点promises,这是构建异步函数的主要概念。当一个异步函数被调用时,它会创建一个 Promise,它只是说,“嘿,我稍后会回调这个,一旦foo完成。” 因此,您的异步函数在移动到下一个函数之前确实完成了,但不同之处在于它现在只知道它需要稍后返回。

在所有同步函数之后,您的异步函数似乎总是完成的原因是因为它确实如此。Promise 总是在当前代码运行之后被调用,因为同样,Javascript 只能在单个线程上运行。

promises 您可以在此处阅读更多信息。

于 2017-10-22T16:47:58.670 回答
1

JS中的异步函数用于做一些需要时间的事情,例如下载一些数据,或者计算一些东西。当然,您可以同步执行此操作,但您的视图将冻结,没有人想要这样。

异步函数在所有同步之后运行是不正确的。(它像正常的同步功能一样开始,但在“任务”完成时结束。

更多:链接

您还应该阅读有关AJAX的更多信息。

于 2017-10-22T15:36:58.903 回答
0

同步调用逐行发生。当所有之前的函数都被调用和执行时,同步行被调用。

javascript 中的异步调用在调用之前等待某个事件发生。它安排在将来发生特定事件时调用的方法。

请注意,异步并不意味着与并发或多线程相同。JavaScript 可以有异步代码,但它通常是单线程的。

阅读更多

这可以通过称为事件循环的东西来实现。

考虑以下代码片段。

console.log("1");
setTimeout(() => {
 console.log("2");
},0);
console.log("3");

输出是

1
3
2

这是因为行号。2是异步方法调用。此方法被添加到称为事件循环的队列中,然后在将来,当计时器结束或调用堆栈为空时出列。

于 2017-10-23T04:49:58.860 回答