【问题标题】:casperjs infinite loop timeout not waitingcasperjs无限循环超时不等待
【发布时间】:2016-07-17 15:18:05
【问题描述】:

我正在使用 casperjs,我试图获取使用 websockets 更改其值的网站的内容。 为此,我不想为每个值添加事件侦听器,而只想每 10 秒抓取一次整个网站。

我有以下代码:

casper.waitForResource("http://website.com",function() {
 getPrices(casper);
});

在 getPrices 中,我可以删除这些值,最后我有以下几行:

setTimeout(getPrices(casper),5000);

问题是我不知道为什么 casper 会忽略超时。它只是在不睡觉的情况下调用它。 另一方面,我不认为这是最好的解决方案,因为它是递归的,从长远来看,它最终会得到一个内存堆栈。

我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: javascript phantomjs casperjs slimerjs


    【解决方案1】:

    您正在立即调用getPrices(casper),然后将该返回值传递给setTimeout(),因此它不会在调用函数之前等待计时器触发。

    您对此的陈述:

    setTimeout(getPrices(casper),5000);
    

    是这样的:

    var temp = getPrices(casper);
    setTimeout(temp, 5000);
    

    如您所见,它立即调用该函数并将一些返回值传递给setTimeout(),这不是您想要的。

    要修复它,请更改为其中一个

    // pass anonymous stub function
    setTimeout(function() {
        getPrices(casper);
    },5000);
    
    // use .bind() to create temporary function with the casper parameter bound to it
    setTimeout(getPrices.bind(null, casper), 5000);
    

    setTimeout() 重复调用函数实际上并不是递归的。堆栈在setTimeout() 触发之前完全展开,因此没有堆栈堆积。

    【讨论】:

    • 哇!感谢您的快速回复,我尝试了您的解决方案,现在再次调用它,但我注意到它第一次执行时,好的,它打印了 1 次,下一次打印数组两次,依此类推,直到它总是打印。另一方面,你能解释一下你刚刚做了什么吗?那是什么 bind(null,casper) ?谢谢!
    • @gabrielmellace - 你可以阅读.bind() here on MDN
    • @gabrielmellace - 我不知道“两次打印数组”是什么意思。您的问题与此无关。
    • 我的错,刚刚读到您回答“更改为其中之一”,现在它工作正常(:谢谢!!
    • 我正在等待将答案标记为正确的时间,但我有一个疑问,这种方法从长远来看不会产生内存泄漏吗?还有其他方法吗?
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2016-07-22
    相关资源
    最近更新 更多