数组中缺less元素

我是Node.js的新手 我正在使用zombie.js从一些网站上刮取网页标题。 以下是我的代码:

var Browser = require("zombie"); var util = require("util"); halt = require('delayed'); title = []; url = [ 'http://www.apple.com', 'http://www.microsoft.com', 'http://www.dell.com' ]; function getTitles(url){ //console.log('Start scraping title'); var length = url.length; console.log('Total Site to Scrape: '+length); label = 1; for(var i=0;i<length;i++){ browser = new Browser() browser.runScripts = false browser.setMaxListeners(0); browser.visit(url[i], function(e, browser, status, errors) { browser.wait(function(){ title[i] = browser.text('html > head > title'); console.log(label+': '+title[i]); browser.close(); label++; }); }); }; } getTitles(url); halt.delay(function () { console.log('Array Length: '+title.length) console.log('Array Content: '+title) }, 10) 

以下是代码的输出:

 Total Site to Scrape: 3 1: Apple 2: Dell Official Site - The Power To Do More | Dell 3: Microsoft Home Page | Devices and Services Array Length: 4 Array Content: ,,,Microsoft Home Page | Devices and Services 

我不明白的部分:

  1. 为什么数组长度返回4而不是3? 只有三个url
  2. 为什么数组内容只返回最后一个元素? 另外两个缺失的元素在哪里?

我不熟悉僵尸,但我很确定这是一个封闭的问题。 当你认为是的时候, i不是你所想的那样。 看到这个答案: 循环中的JavaScript闭包 -关于闭包的一些信息的简单实用的例子 。 基本上发生了什么是你的循环继续,即使你的请求是asynchronous的,当他们回来的时候他们不这样做,你已经循环了所有的3个URL,现在你有三个元素…那么它插入所有3值转化为第四元素。 最后一个胜利,所以你看到微软。