【问题标题】:CasperJS evaluate returns a functionCasperJS 评估返回一个函数
【发布时间】:2013-09-07 01:47:13
【问题描述】:

如何让evaluate返回回调的返回值?

ary = @evaluate ->
  [1, 2, 3]
@echo "LENGTH: #{ary.length}"
@echo "TYPE: #{ary.constructor}"

输出:

LENGTH: undefined
TYPE: function

然后它输出函数的主体,这是 Casper 的一部分。

基于this one 之类的样本,我期待ary 成为我的数组。我在这里错过了什么?

更新:

顺便说一句,这是可行的:

ary = eval @evaluate ->
  '[1, 2, 3]'
@echo "LENGTH: #{ary.length}"
@echo "TYPE: #{ary.constructor}"

输出:

LENGTH: 3
TYPE: Array

我是否必须将evaluate 的输出编组为字符串(或其他原语)?这不是样本显示的内容。

更新 #2

我正在使用 PhantomJS 1.9.1,这可能与它有关,因为在降级到 1.9.0 后我无法复制该问题。

【问题讨论】:

    标签: phantomjs casperjs


    【解决方案1】:

    我可以在 CasperJS 1.1-dev 和 PhantomJS 1.9.1 上使用以下代码

    ary = []
    casper.then ->
      ary = @evaluate ->
        [1, 2, 3]
    
    casper.then ->
      @echo "LENGTH: #{ary.length}"
      @echo "TYPE: #{ary.constructor}"
      require('utils').dump(ary)
    

    这会产生以下输出:

    LENGTH: 3
    TYPE: function Array() {
        [native code]
    }
    [
        1,
        2,
        3
    ]
    

    您面临的问题很可能是由于

    @echo "LENGTH: #{ary.length}"
    @echo "TYPE: #{ary.constructor}"
    

    在 evaluate 完成执行之前打印。

    通过将这两个都包装在 Casper.then 中,您可以避免遇到这些异步问题。

    【讨论】:

    • 我的例子可能太天真了。实际上,我在对casper.then、casper.thenOpen 等的回调中遇到了这个问题。但是,我使用的是 CasperJS 1.0.2,因此这似乎是更可能的问题。我现在修复所有问题的方法是使用 PhantomJS 1.9.0。
    • 看起来 CasperJS = 1.9 兼容。 source.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多