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.whosebug.com', function() {
    this.echo('start');
    this.emit('foo');
});


casper.then(function() {
    this.echo('done');
});

casper.run();

我知道 then() 将等待检查 3 flags:pendingWait、loadInProgress 和 navigationRequested。打印出调用堆栈显示 emit 调用在函数 start() 中,那么在事件完成之前 start() 不会被视为完成吗? IE。将 then() 等到事件结束

我测试了这个等待 60 秒,我确实得到了输出:

start
foo
done

虽然我不确定超过某个超时是否会触发下一个 then()。

你必须记住哪些函数是异步执行的。在您的情况下,前两行输出在页面加载时立即打印,done 在 60 秒后打印。

要知道的事情:

  • 所有 then*wait* 函数都会将一个步骤插入队列,但它们本身是异步的。
  • casper.emit 将查找已注册的事件处理程序并立即执行(非异步)。
  • casper.echo 会立即打印一些东西(非异步)。

事件的顺序是在start回调中,它本身就是一个step函数,触发一个事件,立即执行。这个执行的事件包含一个 wait 调用,它在当前步骤之后添加一个延迟步骤(我们仍在 start 回调中)。然后执行echo,当前步结束。下一步从等待 60 秒开始。由于没有回调传递给 wait,因此执行下一个预定步骤。这是包含 echo('done').

的最后一步

所以严格来说then不会等待上一步的事件执行,但在这种情况下并没有中断控制流(通常通过setTimeout完成)并且CasperJS 步骤处理器捕获了内部 wait 步骤。