事实上,我以前从来没有想过这个问题,但最近,我踩到了坑,我明白了这些东西,然后我会给你一个简单的谈话。
首先,简要介绍同步、异步和回调函数的概念,以帮助您快速理解问题
- 同步:发出调用时,在得到结果之前不会返回调用;一旦调用返回,将获得返回值。换句话说,调用器主动等待调用结果。
- 异步:调用发出后,调用直接返回,因此没有返回结果。当异步调用发出时,调用者不会立即得到结果。相反,调用发出后,调用者可以通过状态、通知或回调函数响应结果。
- 回调函数:如果主函数通过参数将函数传输到其他代码,则引用可执行代码。简单地说,函数执行后的返回数据以参数的形式传输给主函数。
然后进入主菜,谈谈我当时遇到的问题。
问题描述js 有两个句子:一个是加载控件,即显示加载中的动画样式;二是异步法,回调函数中有一个 alert 弹窗。当我执行它时,我发现了一个问题,即加载动画总是延迟几秒钟,等待异步调用来显示加载动画和弹出 alert 弹窗几乎是同时的。这当然不符合我的需要。我最初的想法是在异步调用后台界面时显示加载动画,以提醒用户等待,而不是在调整完成后显示加载动画,这将毫无意义。
问题分析一开始,我不知道发生了什么,所以我很困惑。起初,我认为这是一个代码问题。后来,我仍然没有任何想法,所以我问了别人,然后老板告诉我,js 它本身是一个单线程,每次只能执行一个任务,我的问题是加载动画和异步方法执行得太快,导致加载动画代码执行,但在显示时,需要与异步回调 alert 弹出窗口竞争CPU资源。正常情况下,根据你使用CPU一段时间,我使用CPU一段时间,这导致最后两个控制器几乎同时显示,这几乎是事实。
问题解决听完之后,我立刻明白了很多事情,然后用settimeout()函数将异步方法延迟100毫秒,这个问题立即解决了。
然而,还有另一个问题,因为异步函数实际上可以理解为单线程执行。执行后不会立即回调,而是在处理完成后将结果传递给回调函数。事实上,异步调用不会影响以前的代码,但如果后续代码有回调函数的标志字段,例如,如果执行成功,回调函数将更新该标志字段的值。但调用异步函数后,会立即向下执行代码。同步和异步都可以有回调函数,但是现在一般异步回调用的比较多。同步将等待函数执行真正结束后再向下执行,因此下面的标志字段值不会受到影响。而异步则是在执行函数后直接向下执行,不会等待,所以在这种情况下。我们在回调中的标志字段可能还没有被赋值。判断标志字段位置的代码实际上是一个问题。
事实上,这个问题有很多解决方案。例如,您可以通过轮询来判断标志位是否被赋值。如果您已被赋值,您可以结束轮询并向下执行;或者将以下操作放入回调中,并在回调中完成原始操作后直接执行后直接执行代码。这样,就更方便了。你不必单独做轮询判断,这样问题就解决了。
问题就是这样的问题,事情就是这样的事情,学到了新的知识!