1

我有一个非常棘手的任务,但是 NodeJS 的新手。

所以我需要遍历 URL 数组,从数组中获取每个页面,通过 jsdom+jquery 传递它并在数组末尾添加新找到的 URL。

乍一看,任务非常简单,但由于 NodeJS 的异步,它变成了噩梦。

现在我有类似的代码(为了更好地理解它被简化了)

var jsdom = require("jsdom");
var fs = require("fs");
var jquery = fs.readFileSync("./jquery.js").toString();

var fields = ['http://some.url/page.html']

for(var b=0, len = fields.length;b<len;b++){

jsdom.env({
      html: fields[b],
      src: [jquery],
      done: function (errors, window) {
            var $ = window.$;
            $("div.pager a").each(function() {
                //Push new finded hyperlinks in array
              fields.push($(this).attr('href'));
            });

        }
    });
    //recalculate actual length of array to make more loop
    len=fields.length;
}

并且由于 NodeJS 的概念,它的构造肯定是行不通的。有人可以建议如何将它变成现实生活吗?

4

2 回答 2

0

您应该为此使用 async.eachSeries()。当您有需要在循环中运行的异步代码时,您应该始终使用异步库。

于 2014-01-26T00:11:27.097 回答
0

我会明确建议你花一些时间来学习异步行为,没有它 node.js 没有任何意义。您粘贴的代码错误有几个原因。

请看一下我对链接爬虫的实现,对于我做的宠物项目。锄头有帮助。

https://github.com/alexanderbeletsky/freeze/blob/master/src/crawler.js

于 2012-12-09T19:50:44.093 回答