javascript-无法一起执行的函数

我最近正在构建一个刮板模块,以获取有关nodejs的一些信息,直到遇到此“小”问题为止.我正在使用的模块是cheeriojs和request.
实际上,如果我一次只调用一个方法,则该模块就像一个超级按钮一样工作.它包含三个函数,并且只有两个函数被导出,这是代码:

'use strict';

var request = require('request'),
    cheerio = require('cheerio'),
    counter = 0;

function find(term, cat, callback) {
  // All the check for the parameters
  scrape("http://.../search.php?search=" + encodeURIComponent(term), cat, callback);
}

function last(cat, callback) {
  // All the check for the parameters
  scrape("http://google.com/", cat, callback);
}

function scrape(url, cat, callback) {
  request(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      var $= cheerio.load(body);
      var result = [];

      var items = $('.foo, .foo2').filter(function() {
        // Condition to filter the resulted items
      });

      items.each(function(i, row) {
        // Had to do another request inside here to scrape other information
        request( $(".newpagelink").attr("href"), function(error, response, body) {
          var name = $(".selector").text(),
              surname = $(".selector2").text(),
              link = cheerio.load(body)('.magnet').attr('href'); // This is the only thing that I'm scraping from the new page, the rest comes from the other "cheerio.load"
        // Push an object in the array
        result.push( { "name": name, "surname": surname, "link": link } );

          // To check when the async requests are ended
          counter++;
          if(counter == items.length-1) {
            callback(null, result);
          }
        });
      });
    }
  });
}

exports.find = find;
exports.last = last;

就像我说的那样,现在的问题是,如果我创建一个新的节点脚本“ test.js”,而我只调用了last OR find,那么它将完美地运行!但是,如果我像这样连续调用两个方法:

var mod = require("../index-tmp.js");
mod.find("bla", "blabla", function(err, data) {
    if (err) throw err;
    console.log(data.length + " find");
});
mod.last(function(err, data) {
  console.log(data.length + " last");
});

结果被完全弄乱了,有时脚本甚至不输出任何内容,有时只输出“ find”或“ last”的结果,而有时返回cheeriojs错误(我不会在此处添加以免打乱您,因为可能是我的脚本的错误).我以为两种方法也要重复两次相同的功能,但是什么也没发生,出现相同的问题……我不知道要尝试什么,我希望您能告诉我这种现象的原因!

解决方法:

您的计数器变量是全局变量,并不特定于每个抓取调用.如果您一次或两次调用find两次都将无效.

移动声明并初始化var counter = 0;到scrape函数中,甚至最好放在结果和项声明旁边.

上一篇:使用node.js下载图片


下一篇:前端常用库