我很难理解量角器中的控制流是如何工作的,而JS事件循环又是如何工作的。这是我到目前为止所知道的:
量角器控制流将返回promises的命令存储在队列中。第一个命令将位于队列的前面,最后一个命令将位于队列的后面。任何命令都不会被执行,直到它前面的命令解决了它的承诺。
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();所以有了这段代码,我就能让它工作了。但我不知道它是怎么做到的。在这种情况下,事件循环是如何应用的?
发布于 2015-03-26 08:46:19
ControlFlow实现的核心在runEventLoop_中(在Selenium的promise.js实现中)。
据我所知,ControlFlow使用JS事件循环注册对runEventLoop_的调用(例如,使用0秒超时或诸如此类的)。对runEventLoop_的调用可以看作是普通事件循环的一次迭代。它注册代码以实际运行计划任务(即,实际执行您在it期间排队的工作)。一旦该任务完成或失败(例如,通过挂接其异步promise回调),就会调度runEventLoop_的下一次迭代(请参阅runEventLoop_中对scheduleEventLoop的调用)。
当回调最终注册了新的promises (需要在旧的next事件之前“插入”这些承诺时,会有一些复杂性,这是通过创建一个“嵌套”的控制流来实现的。大多数情况下,您永远不需要知道这个。)
https://stackoverflow.com/questions/29262192
复制相似问题