Node.js递归循环失败

时间:2015-06-13 18:24:09

标签: javascript node.js recursion jquery-callback

以下是 Node.js 脚本。它下载div中包含的图像。该循环适用于 9.86%,最高 id = 36. 当id> 36它退出循环。我正在使用节点0.12版本。循环需要在完成之前运行365次次。我使用了递归回调的方法。

代码:

//Required modules
var fs = require('fs'),
         cheerio = require('cheerio'),
         request = require('request');

//Default Variables
var baseURI =  'http://www.website/';
var year = 2013;
var id = 1;
var savePath = process.argv[2]; 

//Download Function
var download = function(uri, filename, callback){
    request({ uri: uri }, function(err, res, body){    
    var $ = cheerio.load(body);
    var imgDiv = $('#img-wallpaper').children()['0'];
    if(err)
        console.err(err);
    if(typeof imgDiv !== 'undefined') {
    request(imgDiv.attribs.src).pipe(fs.createWriteStream(filename)).on('close', callback);}
    });
};



//Main Function
console.log("Downloading . . .");

// Loop function to create a recursive effect
(function loop(){
    download(baseURI+year+'/'+id+'/wallpaper/', savePath+id+'.jpg', 
    function(){
        console.log(((id/365)*100).toFixed(2)+'% completed');
        if(id == 330) 
            year = "2014";
        if(((id/365)*100) != 100){
            id=id+1;
            loop();}
        });
})(1)

2 个答案:

答案 0 :(得分:1)

我是否理解正确如果您将id的起始值设置为超过35(36?),则脚本不会下载任何图像?

通过仅更改变量,在固定的uri和固定图像上测试脚本。脚本有望成功吗?如果是这种情况:

  • 或者没有为body request
  • 调用回调
  • 或错误的条件typeof imgDiv !== 'undefined'
  • 或者没有为request image
  • 调用回调

因此,当其中一个点出现错误时,脚本就会停止工作。有必要改变条件的严重程度。

答案 1 :(得分:0)

正如@stdob所说,错误是由于

引起的
  • 或imgDiv的错误条件类型!=='undefined'

虽然答案不是克服错误的正确方法,但它更像是一种黑客攻击类型。它会忽略错误并继续脚本!

if(typeof imgDiv !== 'undefined') {
    request(imgDiv.attribs.src).pipe(fs.createWriteStream(filename)).on('close', callback);
}
else{
    id++;
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
}