2015-06-13 120 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

圖像寫入將是'部分'。 callstack緩衝區被填滿導致socked掛斷錯誤! – 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); 
}