【问题标题】:Does CasperJs then() wait on emitted events in the previous function?CasperJs then() 是否等待前一个函数中发出的事件?
【发布时间】:2015-03-02 01:57:41
【问题描述】:

我只是好奇 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 flags:pendingWait、loadInProgress 和 navigationRequested。打印出调用堆栈显示发出调用在函数 start() 中,所以在事件完成之前不会认为 start() 完成? IE。将 then() 等到事件完成

我用 60 秒的等待时间对此进行了测试,我确实得到了输出:

start
foo
done

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

【问题讨论】:

    标签: javascript events casperjs callstack


    【解决方案1】:

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

    须知:

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

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

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

    【讨论】:

    • 非常详尽,感谢您的回复!如果我用一些需要一些时间的非异步逻辑替换了等待语句,我还应该期待相同的输出吗?据我了解,一旦最后一个非异步语句完成(即使该语句在某些事件中),启动回调就会完成,然后()在此之前不会执行。
    • 你的观察是正确的,输出是一样的,但是时间会不同,因为现在阻塞等待是在this.echo('foo');之前
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2020-04-13
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多