javascript - 在node.js中做一个while循环,总是给我最后一个数组项?

标签 javascript node.js coffeescript zombie.js

我正在使用zombie.js库,为了对dom进行一些测试,我有这个脚本

Browser = require "zombie"
arr = new Array("http://yahoo.com", "http://google.com", "http://msn.com")
i = 0
while i < arr.length
    b = new Browser()
    b.visit arr[i], ->
        console.log b.text "title"
    b.close()
    i++

一切正常,但它只记录 msn 标题两次,因此 while 循环记录数组中的最后一项两次。我似乎看不出问题是什么?

最佳答案

您正在注册浏览器访问完成时的回调。此时,循环已运行完毕,因此变量 b 指向您创建的最后一个浏览器,这意味着它的标题将是 MSN 的标题,而不是其他页面的标题。为了解决这个问题,请使用闭包:

Browser = require "zombie"
arr = new Array("http://yahoo.com", "http://google.com", "http://msn.com")
i = 0
createBrowser = (url) ->
    b = new Browser()
    b.visit url, -> console.log b.text "title"
    b.close()

while i < arr.length
    createBrowser(arr[i++])

这是可行的,因为现在您创建的每个浏览器都有一个单独的范围,以及一个单独的浏览器变量。

或者,使用 ZombieJS 的 visit 函数的回调参数:

Browser = require "zombie"
arr = new Array("http://yahoo.com", "http://google.com", "http://msn.com")
i = 0
while i < arr.length
    b = new Browser()
    b.visit arr[i], (e, myBrowser) ->
        console.log myBrowser.text "title"
    b.close()
    i++

关于javascript - 在node.js中做一个while循环,总是给我最后一个数组项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439280/

相关文章:

javascript - 如何用正则表达式匹配特定的字符串?

node.js - 使用 NodeJS/Express 返回 ISO-8859-1 中的 JSON 响应

javascript - MONGOOSE - 仅显示我在对象内输入的特定值

javascript - 让 api 调用只监听 localhost

javascript - Coffeescript 中的源映射 - 错误未映射到源

javascript - 如何使用 Meteor.startup 修复文件加载顺序问题?

javascript - 在 ng-repeat 中使用 ng-model 时, Angular 输入在页面加载时不为空

javascript - 多种选择的可下拉菜单

coffeescript - Meteor:如何从模板助手返回模板?

javascript - 这个 Angular 代码有什么问题吗?