我只是好奇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
步骤。