我很难理解量角器中的控制流如何与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(那些需要在旧的下一个事件之前被“插入”)时会有一些复杂性,这是通过创建一个“嵌套”控制流来完成的.大多数情况下你永远不必知道这个.)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。