2016-10-18 85 views
0

我有一個JSON文件,其中包含服務器上的文件名列表。我需要遍歷這個列表並在本地保存每個文件。我有這個工作在一定程度上。有時候它的作用就像是一種魅力,其他的則不然,我最終得到的是空文件。Node.js - 使用http.get循環瀏覽JSON本地保存文件

我知道這可能是開始下載之前完成的下一個文件,但我很努力重新寫這個,以便我得到一個回調,當文件完成開始下載下一個。我對客戶端編碼並不熟悉,所以非常感謝這方面的幫助。

var filefolder = 'http://www.example.com/files/'; 
     var newdir = nw.App.dataPath; 
     $.each(jsonFiles, function(i, fn) { 
      //read and download to save locally 
      var filelink = filefolder + '/' + fn; 
      var newfile = fs.createWriteStream(newdir+'/files/' + '/' + fn); 
      var request = http.get(filelink, function(response) { 
       response.pipe(newfile); 
       console.log(fn); 
       newfile.on('finish', function() { 
        newfile.close(cb); 
       }); 
      }); 
     }); 
+0

好像你有一個異步種族問題。也許嘗試在「http.get ...」的回調中放置「var newfile = ...」。然後將「response.pipe ...」移入「newfile.on('finish')」回調中「 – josephnvu

+0

用'filelink,newfile,fn&cb'作爲參數封裝'http.get'調用,因爲參數可能工作 – Thaadikkaaran

+0

謝謝@josephnvu,嘗試了你的建議,但所有的文件都是空的,而不僅僅是一些。 – LeeTee

回答

1

因爲你的下載代碼裏面each環和http.get是異步,你必須與包裹封呼叫。

這樣的事情,

var filefolder = 'http://www.example.com/files/'; 
var newdir = nw.App.dataPath; 
$.each(jsonFiles, function(i, fn) { 
    //read and download to save locally 
    var filelink = filefolder + '/' + fn; 
    var newfile = fs.createWriteStream(newdir + '/files/' + '/' + fn); 
    (function(filelink, newfile, fn, cb) { 
     var request = http.get(filelink, function(response) { 
       response.pipe(newfile); 
       console.log(fn); 
       newfile.on('finish', function() { 
        newfile.close(cb); 
       }); 
      }); 
    })(filelink, newfile, fn, cb) 
}); 
+0

感謝您的幫助。我仍然得到一些空文件不幸的是:( – LeeTee