2016-12-04 69 views
1

我想從YouTube視頻的信息。從我看起來像這樣的一個文件,獲取ID:For循環不追加到其他JSON在原來的順序

songlist.json

["vbMQfaG6lo8", "07UwP3kHTTk", "gjDK4OiuIfk", "NlrK03iz74A", "E_1-oylPHjs"] 

之後,我需要的文件,還需要數據的每個ID

var songlistshit = './static/js/songlistinfo.json' 
var allSongs = require('./static/js/songlist.json')  
for(var i = 0; i < allSongs.length; i++) { 
    var ytId = allSongs[i] 
    request("https://www.googleapis.com/youtube/v3/videos?id=" + ytId + "&key=API_KEY%20&part=snippet,contentDetails,statistics,status", function (error, response, body) { 
     var sd = JSON.parse(body); 
     var xd = sd.items[0].snippet.title 
     var aus = sd.items[0].snippet 
     name = aus.title 
     tn = aus.thumbnails.default.url 
     var data = '\n{"name": "' + name + '", "user": "Mstiekema", "img": "' + tn + '"},' 
     fs.appendFile(songlistshit, data, 'utf8', function(err) {if (err) {return}}) 

    }) 
}; 

但當它附加到第二個JSON文件時,它會丟失原始順序。這是一個如何將它放入文件的例子。

songlistinfo.json

{"name": "Enjoy The Silence by KI Theory (Ghost In The Shell Trailer Music)", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/E_1-oylPHjs/default.jpg"}, 
{"name": "Majora's Mask - Terrible Fate", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/vbMQfaG6lo8/default.jpg"}, 
{"name": "Lilium Elfen Lied-エルフェンリート", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/07UwP3kHTTk/default.jpg"}, 
{"name": "MODERN PILLOW TALKING", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/gjDK4OiuIfk/default.jpg"}, 
{"name": "Midna's Theme on Guitar", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/NlrK03iz74A/default.jpg"}, 

但它不應該是這個順序。順序應該是如下:

songlistinfo.json

{"name": "Majora's Mask - Terrible Fate", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/vbMQfaG6lo8/default.jpg"}, 
{"name": "Lilium Elfen Lied-エルフェンリート", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/07UwP3kHTTk/default.jpg"}, 
{"name": "MODERN PILLOW TALKING", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/gjDK4OiuIfk/default.jpg"}, 
{"name": "Midna's Theme on Guitar", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/NlrK03iz74A/default.jpg"}, 
{"name": "Enjoy The Silence by KI Theory (Ghost In The Shell Trailer Music)", "user": "Mstiekema", "img": "https://i.ytimg.com/vi/E_1-oylPHjs/default.jpg"}, 

(我知道songlistinfo.json文件不包含正確的JSON結構,但我會修復後固定的訂單問題。)

+0

你可能要刪除其中包含在URL中你的API密鑰的部分。 – devilfart

回答

0

你寫asynchronusly文件,它的順序寫入文件請求完成後,並非所有要求都能按時完成。你可以通過使用遞歸函數而不是for循環來解決這個問題。

requestVideoInfo(0); 

function requestVideoInfo(count) { 
    if(count < allSongs.length) { 
    ytId = allSongs[count] 
    request("https://www.googleapis.com/youtube/v3/videos?id=" + ytId + "&key=API_KEY%20&part=snippet,contentDetails,statistics,status", function (error, response, body) { 
     var sd = JSON.parse(body); 
     var xd = sd.items[0].snippet.title 
     var aus = sd.items[0].snippet 
     name = aus.title 
     tn = aus.thumbnails.default.url 
     var data = '\n{"name": "' + name + '", "user": "Mstiekema", "img": "' + tn + '"},' 
     fs.appendFile(songlistshit, data, 'utf8', function(err) { 
     if (err) 
      console.log('Error', e); 
     else 
      requestVideoInfo(++count); 

     // start to request the next video into once this one is done 
     }) 
    }) 
    } 
} 

但是你可以看到你的代碼性能產生負面影響怎麼一回事,因爲你不再做一次多個呼叫,和失去的request回調性質benifet。

0

的順序propably不對,因爲你使用的是沒有以相同的順序來完成,你叫他們異步請求。

例如根據請求時間到YouTube您的回調可能在不同的順序,每次運行。你必須要麼使用像藍鳥一些庫all方法將處理所有的承諾(第一個你必須轉換request方法返回承諾或使用藍鳥promisify方法),然後你會得到相同的響應列表爲了您呼叫請求。

或者您也可以手動創建的響應數組後他們都將被處理,你可以與一些alghoritm重新排列它們具有相同的順序爲您的JSON。

關鍵的事實是,在所謂的異步循環功能都不能保證以相同的順序來解析,你叫他們:)