我很难理解量角器中的控制流如何与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(那些需要在旧的下一个事件之前被“插入”)时会有一些复杂性,这是通过创建一个“嵌套”控制流来完成的.大多数情况下你永远不必知道这个.)