2014-04-30 28 views
2

我試圖用節點js複製幾個文件。Nodejs,如何在沒有崩潰的情況下複製nodej中的多個文件

這裏是我的什麼,我試圖做一個例子:

var request = require('request'); 
va photos [{ 'url': 'http://xxxx.com/im1', 'name' : 'name1' }, { 'url': 'http://xxxx.com/im12', 'name' : 'name2' }, 
for (var i = 0; i < photos.length; i++) { 
         request(photos[i].source).pipe(fs.createWriteStream(photos[i].name)); 
    } 

後也許1000調用我有一個插座掛出錯誤。

以下@Timothy簡單的建議我決定使用異步模塊。

我的代碼是現在這樣的:

async.whilst(function() { return !stop; }, 
       function (callback) { 
        console.log("get next 20 image"); 
        JM.api('/' + album.id + '/photos', { after: next }, function (resf) { 
         if (!resf || resf.error) { 
          console.log(!resf ? 'error occurred' : resf.error); 
         } 
         console.log("albums" + album.id + " " + resf.data.length + " dir" + dir); 

         async.eachSeries(resf.data, function (photo, done) { 

          request(photo.source).pipe(fs.createWriteStream(dir + "/" +photo.name)); 
          console.log("copy of image " + img_basename); 
         }, function (err) { 
          if (err) { 
           console.log('An images failed to copy'); 
          } else { 
           console.log('All 20 image have been copied successfully'); 
          } 
          if (resf.paging && resf.paging.cursors) { 
           console.log("suite de l'album à venir"); 
           next = resf.paging.cursors.after; 
           setTimeout(function() { callback(); }, 5000); 
          } 
          else { 
           console.log("Fin de l'album"); 
           stop = true; 
           setTimeout(function() { callback(); }, 5000); 
          } 
         }); 
        }); 
       }, 
       function (err) { 
        if (err) { 
         console.log('An images failed to process'); 
         albumcallback(); 
        } else { 
         console.log('All images in this group have been processed successfully'); 
         albumcallback(); 
        } 
       } 
      );// end while 

我仍然有可能後1 00文件複製崩潰。我確定async.whilst和async.eachSeries是weel,因爲我的日誌顯示每個調用都是串聯的。但我有一個崩潰。我暫時通過在每個副本之後加入等待來解決問題,如下所示:

request(photo.source).pipe(fs.createWriteStream(dir + "/" + img_basename)); 
          console.log("copy of image " + img_basename); 
          setTimeout(function() { done(); }, 5000); 

是否是請求模塊的限制?如何更改此fea線以確保每個連接在連接程序之前都關閉?

回答

2

您可能需要移至異步循環。類似async模塊的eachLimit可能是理想的。

async.eachLimit(photos, 10, function(photo, done) { 
    var r = request(photos[i].source).pipe(fs.createWriteStream(photos[i].name)); 
    r.on('finish', done); 
}, function(err) { 
    // All images done or there was an error 
}); 

現在它會處理您的照片列表中的所有項目,但它只會同時處理其中的10個項目。這將防止它跳出數百或數千個併發傳出連接。

+0

嗨。感謝您的支持者。我需要更多的信息,因爲我的代碼稍微複雜一點。我無法在一次通話中獲得所有照片,所以我已經處於一種循環狀態,並且我的照片數量是20。所以,如果我多次調用asyn.eachlimit,它會完成這項工作?或者它不會序列化電話?提前謝謝。 – mcbjam

+1

如果您要傳遞數百個要處理的內容,並且想要限制處理速度,我建議使用每個限制。它將基本上取代你試圖做的事情,把它們分成照片組。如果你想保持你的組設置,你可以在外部循環中使用eachSeries。這意味着它只會在第一組完成後處理第二組圖片。 https://github.com/caolan/async#eachSeries –

+0

謝謝。我會嘗試。 – mcbjam

相關問題