前端入门20-JavaScript进阶之异步回调的执行时机 (2)

alert() 会阻塞当前程序,当 js 执行到 alert() 的代码时卡在这里,后续代码不会被执行,直到取消弹窗。所以,我们可以通过注释上例中相对应的 alert() 来模拟异步请求的结果在什么时候接收到,而这个回调任务又是在哪个时机被执行的。

好,那么疑问来了:

假设,程序卡在 alert("2") 这里,这时候,异步的请求结果回来了,那么回调任务是会被接到哪个时机执行?等我取消 alert 的弹窗后就先执行回调任务然后再继续处理 alert("2") 后的代码吗?

我们将 alert("A") 注释掉,运行一下,测试看看:

前端入门20-JavaScript进阶之异步回调的执行时机

当前程序确实卡在 alert("2"),而且我们等到请求结果回来了,这时,我们把 alert 弹窗取消掉,看看日志:

前端入门20-JavaScript进阶之异步回调的执行时机

回调任务中输出的 success 在 alert("2") 后续代码输出的 2.1 下面,那么就是先继续执行 alert("2") 后面的代码,然后才会执行回调任务的代码了,那么这个后面的代码究竟包括哪些代码?

好,这个时候,我们把 alert("2") 代码注释掉,让程序卡在 alert("A") 这行代码。

假设,当前程序正在执行某个函数内的代码,这个时候异步请求的结果回来了,那么这个回调任务会接在这个函数执行结束后吗?也就是,我们现在来验证下事件的粒度是否是以函数为粒度?

前端入门20-JavaScript进阶之异步回调的执行时机

前端入门20-JavaScript进阶之异步回调的执行时机

程序确实卡在函数 A 内部的代码 alert("A"),输出的日志上也能看到现在已经输出到 2.2,且异步请求的结果也回来了,那么这个回调任务的代码会在函数调用执行结束后,就被处理吗?如果是的话,那么日志 2.2 接下去应该要输出 success 才对,如果不是,那么就会输出 2.3,看看日志:

前端入门20-JavaScript进阶之异步回调的执行时机

也就是说,即使异步请求结果回来了,回调任务也不能在当前函数执行完后立马被处理,它还是得继续等待,等到函数后面的代码也执行完了,那这个后面的代码到底是什么呢?也就是事件的粒度到底是什么呢?

我们试过了以每行代码为粒度做测试,也试过了以函数为粒度做测试,那还能以什么作为粒度呢?或者是以 <script> 为粒度,只有等当前 <script> 标签内的代码都执行完,才轮到下个代码段执行?

从上面两种场景下,所得到的日志来看,似乎确实也是这么个结论,success 的日志都是在 2.3 和 3 之间输出,2.3 表示当前 <script> 标签里的最后一行代码,而 3 表示下个 <script> 标签内的第一行代码。

既然这样,我们再来做个测试:

<script type="text/javascript"> console.log("----------1-----------"); $.ajax({ url: "https://easy-mock.com/mock/5b592c01e4e04f38c7a55958/ywb/is/version/checkVersion", data: {"key": 122}, type: "POST", success: function (data) { console.log("----------success-----------"); //什么时候会执行回调 }, error: function (e) { console.log("----------error-----------"); } }); /* console.log("----------2-----------"); alert("2"); //第一个卡点 console.log("----------2.1-----------"); function A() { console.log("------------2.2-----------"); alert("A"); //第二个卡点 } A(); console.log("---------------2.3---------------") */ </script> <script type="text/javascript"> console.log("----------3-----------"); alert("3"); //第三个卡点 console.log("----------3.1---------") </script>

我们把第一个 <script> 标签内那些用于上面两种场景测试的代码注释掉,只留一个异步请求的代码,然后在第二个 <script> 标签内,加个 alert("3") 来模拟程序是在第一个 <script> 中发起异步请求,但直到程序运行到第二个 <script> 时,异步请求结果才回来,这种场景下回调任务的执行时机会是在哪?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxfd.html