2015-11-11 58 views
0

我正面臨一個奇怪的問題(至少對我而言)。我試圖通過wget獲取(通過wget下載)一個json文件,解析它並提取一些內容(圖片url)。該內容然後被存儲在保存在txt文件中的數組中。最後,我再次使用wget來下載圖像網址列表。解析json並寫入文件

我使用Electron.io這個應用程序。使用Ajax功能可以執行此nodejs功能:

expressApp.get('/update', function(req, res) { 
var util = require('util'), 
    exec = require('child_process').exec, 
    child, url1 = 'http://xxxxxx/api/product/'; 

exec = require('child_process').exec, 
    child, url2 = 'http://xxxxxx/api/image/'; 

child = exec('wget ' + url1 + ' -O update.json', 

    function(error, stdout, stderr) { 
     console.log('stdout: ' + stdout); 
     console.log('stderr: ' + stderr); 
     console.log('Content updated!') 
     if (error !== null) { 
      console.log('exec error: ' + error); 
     } 
    }); 

child = exec('wget ' + url2 + ' -O image.json', 

    function(error, stdout, stderr) { 
     console.log('stdout: ' + stdout); 
     console.log('stderr: ' + stderr); 
     console.log('Image.json downloaded!') 
     if (error !== null) { 
      console.log('exec error: ' + error); 
     } 

    }); 

var file = __dirname + '/image.json'; 
var file_updated = __dirname + '/image_name.txt'; 

fs.readFile(file, 'utf8', function(err, data) { 
    if (err) { 
     console.log('Error: ' + err); 
     return; 
    } 

    data = JSON.parse(data); 

    var arr = data.objects.map(function(item) { 
     return item.image; 
    }) 

    var arr_updated = arr.toString(); 

    // console.log(arr); 

    fs.writeFile(file_updated, '', function() { 
     fs.writeFile(file_updated, arr_updated, function(err) { 
      if (err) return console.log(err); 
      console.log('List of image url added!'); 

      fs.readFile(file_updated, 'utf-8', function(err, data) { 
       if (err) { 
        return console.log(err); 
       } 
       var result = data.replace(/,/g, '\n'); 

       fs.writeFile(file_updated, result, 'utf8', function(err) { 
        if (err) return console.log(err); 
       }); 
      }); 
     }); 
    }) 
}); 

// child = exec('wget -i ' + file_updated + ' -P images', {maxBuffer: 1024 * 100000}, 

// function (error, stdout, stderr) { 
//  console.log('stdout: ' + stdout); 
//  console.log('stderr: ' + stderr); 
//  console.log('Images downloaded!') 
//  if (error !== null) { 
//  console.log('exec error: ' + error); 
//  } 

// }); 

});

我的問題是,當我執行一次這個腳本,image_text.txt不更新,當我再次執行更新。我試圖瞭解爲什麼,但不知道... 如果有人能幫助我。

在預先感謝了很多。

回答

1

您的所有功能都是異步的。這意味着,你需要運行下一個

所以,你的代碼之前等待完成先前的功能應該尋找這樣

child = exec('wget ' + url1 + ' -O update.json', 

    function(error, stdout, stderr) { 
     // ... 
     child = exec('wget ' + url2 + ' -O image.json', 

      function(error, stdout, stderr) { 
       //... 

      } 
     ) 
    } 
) 

等。您需要先下載文件,然後才能對其進行處理。 exec火災回調,當你wget過程中完成的

對於回調地獄處理您可以使用https://github.com/caolan/async

+0

非常感謝vmkcom我更新了我的代碼,就像你說的。有用!!! – Silvering