量角器:控制流和javascript事件循环之间的关系是什么?

我很难理解量角器中的控制流如何与JS事件循环的工作方式相关.这是我目前所知道的:

量角器控制流存储返回队列中的promise的命令.第一个命令位于队列的前面,最后一个命令位于后面.在其前面的命令解除其承诺之前,不会执行任何命令.

JS事件循环存储异步任务(回调是特定的).在堆栈中的所有函数完成且堆栈为空之前,不会执行回调.在运行每个回调之前,检查堆栈是否为空.

所以我们以此代码为例.代码基本上是单击搜索按钮并发出api请求.然后在返回数据之后,它检查是否存在存储返回数据的字段.

elem('#searchButton').click(); //will execute a api call to retrieve data
browser.wait(ExpectedConditions.presenceOf(elem('#resultdatafield'),3000));
expect(elem('#resultdatafield').isPresent()).toBeTruthy();

因此,使用此代码,我能够让它工作.但我不知道它是怎么做到的.在这种情况下如何应用事件循环?

解决方法

ControlFlow实现的核心是 runEventLoop_(在Selenium的promise.js实现中).

据我了解,ControlFlow使用JS事件循环注册对runEventLoop_的调用(例如,具有0秒超时或某些时间).对runEventLoop_的调用可以被认为是正常事件循环的单个迭代.它注册代码以实际运行计划任务(即,实际执行您在其中排队的工作).一旦该任务完成或失败(例如,通过挂钩其异步承诺回调),就会调度runEventLoop_的下一次迭代(请参阅runEventLoop_中对scheduleEventLoop的调用).

当回调最终注册新的promise(那些需要在旧的下一个事件之前被“插入”)时会有一些复杂性,这是通过创建一个“嵌套”控制流来完成的.大多数情况下你永远不必知道这个.)

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...