CasperJs then() 是否等待上一个函数中发出的事件

Does CasperJs then() wait on emitted events in the previous function?

本文关键字:事件 函数 上一个 then 是否 等待 CasperJs      更新时间:2023-09-26

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