CasperJs then() 是否等待上一个函数中发出的事件
Does CasperJs then() wait on emitted events in the previous function?
我只是好奇CasperJS如何处理与调用堆栈有关的事件。
假设我们有一些代码:
casper.on('foo', function() {
this.wait(60000);
this.echo('foo');
});
casper.start('http://www.stackoverflow.com', function() {
this.echo('start');
this.emit('foo');
});
casper.then(function() {
this.echo('done');
});
casper.run();
我知道 then() 将等待检查 3 个标志:待处理等待、加载正在进行和导航请求。打印出调用堆栈显示发出调用在函数 start() 中,那么在事件完成之前 start() 不会被视为已完成?即 然后() 将等到事件完成
我测试了 60 秒,我确实得到了输出:
start
foo
done
虽然我不确定超过某个超时是否会触发下一个 then()。
您必须记住哪些函数是异步执行的。在您的情况下,输出的前两行在加载页面时立即打印,并在 60 秒后打印done
。
须知事项:
- 所有
then*
和wait*
函数都将在队列中插入一个步骤,但本身是异步的。 -
casper.emit
将查找已注册的事件处理程序并立即执行它(非异步)。 -
casper.echo
将立即打印某些内容(非异步)。
事件的顺序是,在start
回调(本身是一个阶跃函数)中,触发并立即执行事件。此执行的事件包含一个wait
调用,该调用在当前调用之后添加一个延迟步骤(我们仍在start
回调中)。然后执行echo
并完成当前步骤。下一步从等待 60 秒开始。由于没有向wait
传递回调,因此将执行下一个 sheduled 步骤。这是包含echo('done')
的最后一步。
所以严格来说,then
不会等待上一步的事件执行,但在这种情况下,没有突破控制流(通常通过setTimeout
完成),CasperJS 步骤处理器已经捕获了内部wait
步骤。
相关文章:
- 无法在java脚本中调用图像的点击事件函数
- 如何在事件函数中访问窗口实例
- 事件函数完整日历中的多个ajax调用
- 如何使参数在事件函数中工作
- Jquery Onclick 事件函数第二次不起作用
- 宣传单:双击时不要触发点击事件函数
- Bootstrap/JQuery-单选按钮组事件函数
- 将jQuery事件函数应用于新的Knockout.js数组元素
- 防止在元素上触发新事件,直到当前事件函数在jQuery中完成
- 有没有一种方法可以将多个参数传递给主干js中的事件函数
- 用javascript更新事件函数中的全局变量
- Jquery:如何在事件函数之外获取变量
- 将参数传递给事件函数
- postMessage - 多个 postMessage 事件/函数/回调
- 多事件函数中的悬停延迟
- JavaScript 事件函数 - 在声明之前调用
- 使用 jQuery 循环设置事件函数触发器
- 暂停,直到事件/函数使用 jquery 或 JavaScript 完成
- 如何访问 jQuery 事件函数中的对象属性
- 单击事件函数未从花式盒子灯箱内触发