2013-10-08 17 views
5

Tôi đang cố gắng tải xuống một số tệp từ Flickr bằng cách sử dụng các API Flickr và các cuộc gọi http.get() trong một vòng lặp.Cách tải xuống đồng bộ các tệp từ URL trong node.js

Tôi có một mảng URL hình ảnh và tôi sử dụng chức năng 'tải xuống' để tải xuống hình ảnh Nếu có một số lượng lớn hình ảnh có hầu hết các tệp rỗng. Tôi đã tìm thấy mã tải xuống tại đây.
Vui lòng tư vấn cách tiếp cận điều này.
Cảm ơn bạn trước!

for (i=1;i<100;i++){ 

    filename= "./images/file"+i+".jpg"; 

    download(photourl[i], filename,{}); 


    } //End of for-loop 

..... 

var download = function(url, dest, cb) { 
    var file = fs.createWriteStream(dest); 
    var request = http.get(url, function(response) { 
    response.pipe(file); 
    file.on('finish', function() { 
     file.close(); 
     //cb(); 
    }); 
    }); 
} 

P.S. Và cuối cùng là có lỗi: events.js: 72 ném er; // Unhandled 'error' event ^ Lỗi: socket treo lên tại createHangUpError (http.js: 1442: 15) tại Socket.socketOnEnd [as onend] (http.js: 1538: 23) tại Socket.g (events.js: 175: 14) tại Socket.EventEmitter.emit (events.js: 117: 20) tại _stream_readable.js: 910: 16 tại process._tickCallback (node.js: 415: 13)

+4

Tôi khuyên bạn không nên thực hiện việc này một cách đồng bộ, ngay cả khi bạn có thể tìm ra cách thực hiện điều đó. Tôi sẽ khuyên bạn nên tạo hàng đợi của các tệp để tải xuống và chạy hàng đợi đó vì hình ảnh được tải xuống từng cái một hoặc nhiều lần bạn muốn tại một thời điểm. Điều chỉnh là quan trọng, như bạn đã nhận thấy. – Brad

+1

Brad, cảm ơn! Làm thế nào để tôi bắt đầu với điều đó? – user2013424

Trả lời

3

tôi khuyên bạn nên sử dụng mô-đun async cho việc này:

var i = 1, threads = 5; 
require('async').eachLimit(photourl, threads, function(url, next){ 
    download(url, "./images/file"+(i++)+".jpg", next); 
}, function(){ 
    console.log('finished'); 
}) 

và cb bỏ ghi chú(); trong chức năng tải xuống

+1

có thể 'eachLimit' sẽ là một lựa chọn tốt hơn là cố gắng tải xuống ** tất cả ** của các hình ảnh cùng một lúc? – WiredPrairie

+0

có thể, và có thể không) Tôi thay đổi nó, cảm ơn. –

Các vấn đề liên quan