微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐