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

时间:2015-03-25 17:15:06

标签: protractor

我很难理解量角器中的控制流如何与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();

所以使用这段代码,我能够让它发挥作用。但我不知道它是如何做到的。在这种情况下如何应用事件循环?

1 个答案:

答案 0 :(得分:1)

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

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

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