Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coffeescript 在Casperjs中的URL上循环_Coffeescript_Casperjs - Fatal编程技术网

Coffeescript 在Casperjs中的URL上循环

Coffeescript 在Casperjs中的URL上循环,coffeescript,casperjs,Coffeescript,Casperjs,我试图用Casperjs按顺序打开几个URL 这是我实际代码的简化版本 casper = require('casper').create() casper.start() casper.then () -> items = ['http://www.google.com', 'http://www.yahoo.com'] for item, idx in items this.open item this.then ((idx) ->

我试图用Casperjs按顺序打开几个URL

这是我实际代码的简化版本

casper = require('casper').create()
casper.start()

casper.then () ->
  items = ['http://www.google.com', 'http://www.yahoo.com']

  for item, idx in items
     this.open item
     this.then ((idx) ->
        () ->
            this.capture idx + '.png')(idx)

casper.run()
在我的实际代码中,items数组是在运行时生成的。我希望这段代码将提供google.com和yahoo.com的截图,但实际上这两个截图最终都是yahoo.com。我觉得这与在循环中创建闭包有关,但我不知道如何创建。调用
open
时,
item
引用特定字符串。我永远不会结束它,是吗?

问题是它没有添加步骤,因此它不是异步的(比如
然后打开
)。它立即在外部
内部执行,然后执行
。但是下面的
then
是异步的,因此其步骤被添加到当前步骤之后执行(外部
then
)。两个
open
s都被执行,但是两个
then
s的回调都在最后一个
open
之后执行

因此,解决方案是使用
然后打开
作为组合异步步骤。straigt正向解决方案有一个小问题:

这意味着JavaScript的错误观念适用。这是一个:

项目的
,项目中的idx
行仍然是一个。JavaScript具有函数级作用域和
casper。然后
是一个异步步骤函数,这意味着所有
casper的回调。然后
调用在循环完成后执行(更准确地说是在当前步骤完成后或调用
casper.run
后),但是
casper.open
会立即执行

解决方案:组合
casper。打开
casper。然后
casper。然后打开
并通过iLife传递
idx
,以便它们固定到每个迭代:

for item, idx in items
    ((item, idx) ->
        casper.thenOpen item, () ->
            this.capture idx + '.png'
    )(item, idx)
或者使用
Array.prototype.forEach

items.forEach (item, idx) ->
    casper.thenOpen item, () ->
        this.capture idx + '.png'

我对coffeescript不是很熟练,所以我不知道上面的代码在语法上是否正确。难道不是
casper.open
将open page命令添加到步骤堆栈中吗?页面的实际打开发生在调用了
casper.run
之后,那么为什么会出现排序问题呢?我之所以将
idx
放在闭包中,正如您所说,是因为我希望在运行时保留特定的索引。但是为什么需要关闭
casper.open
调用呢?你把它们捆绑在一起的想法奏效了,但我希望你理解为什么我仍然有点困惑。谢谢,我想我自己还不太清楚。我希望现在更好。”
someQueue.push([“open”,string])
“不会发生,因为
casper.open
不是一个单步函数。它会立即执行,但“
someQueue.push([“then”,func])
”确实会发生,并且会在第二次
casper.open
之后执行。因此,两个屏幕截图显示的是同一个页面。
open
在被调用时立即执行,但它只在外部
的内部被调用,然后
。如果您查看源代码,可能会有所帮助。