2015-06-13 2 views
0

Ниже приведено Node.js Сценарий. Он загружает изображения, содержащиеся в div. Петля отлично работает для 9.86%, которая до id = 36. Когда id> 36, он выходит из цикла. Я использую версию узла 0.12. Контур должен запустить 365 раз перед его завершением. Я использую метод рекурсивный обратный вызов.Node.js Рекурсивная петля не работает

Код:

//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) 
+0

Почему вы рекурсируете, когда между петлями нет зависимости? Почему бы не отправить все запросы на скачивание и собрать результаты? – martypdx

+0

Image Write будет «частично». Буфер вызова-стопа заполняется, что приводит к потере зависания !. – kingspp

ответ

1

Правильно ли я понимаю, что если установить начальное значение для id более 35 (36?) Сценарий не загруженные любых изображений?

Проверьте скрипт на фиксированном uri и фиксированном изображении, изменив только переменные. Сценарий должен работать? Если дело обстоит именно так:

  • Или не называется обратным вызов для body request
  • Или ложное условие typeof imgDiv !== 'undefined'
  • Или не называется обратным вызовом для request image

Таким образом, когда ошибка в одном из них указывает, что скрипт перестает работать. Необходимо изменить тяжесть условий.

+0

Если я изменяю условие на id <= 365, то если id> 36, скрипт работает, но если id = 1, скрипт останавливается на 36. Я думаю, что второй вариант вызывает ошибку. Спасибо за ответ!! – kingspp

0

Как @stdob сказал, была вызвана ошибка из-за

  • Или ложное условие TYPEOF imgDiv! == «не определено»

Хотя ответ не правильный путь, чтобы преодолеть ошибка, это скорее тип взлома. Он игнорирует ошибку и продолжает скрипт!

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); 
} 
Смежные вопросы