2014-04-20 71 views
0

所以我有一個Node.js的功能,上面寫着6個XML文件並查找特定的搜索項,並將其返回給用戶..製作的XML for循環中解析打電話回來

... 
var xmlresult = '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xml:lang="en_EN" version="2.0"><channel>'; 
    for (var i = 1; i <= 6; i++) { 
     filename = i + '.xml'; 
     fs.readFile(filename, 'utf8', function(err, data) { 
      if (err) { 
       return console.log(err); 
      } 
      var doc = libxml.parseXmlString(data); 
      var xpath = "/rss/channel/item[contains(translate(description, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'"+ userquery + "')]"; 
      console.log(xpath); 
      var result = doc.find(xpath); 
      console.log(result); 
      result.forEach(function(item) { 
       xmlresult += item; 
       // console.log(item.text()); 
      }); 
     }); 
    } 
    xmlresult += "</channel></rss>"; 
    // console.log(result[0].text()); 
    respond(xmlresult); 

    function respond(data) { 
     // response.set('Content-Type','text/xml').send(data); 
     response.write(data); 
     response.end(); 
    } 
... 

現在的問題即使在xml解析發生之前,響應也會發生。我知道,因爲節點是異步的。現在,如果我試圖通過添加語句for循環

if(i==6){ 
xmlresult += "</channel></rss>"; 

respond(xmlresult); 
} 

它不會仍然解決,因爲FS我想這個問題要解決的問題和libxmljs去異步。我也嘗試過。所以我該怎麼做?

回答

0

沒關係。使用async.eachSeries解決

var xmlresult = '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xml:lang="en_EN" version="2.0"><channel>'; 
var filenames = [ '1.xml', '2.xml', '3.xml', '4.xml', '5.xml', '6.xml' ]; 
i = 0; 
// filenames.forEach(function(filenames){ 
async.eachSeries(filenames, processfile, respond); 

// }); 
function processfile(filename,callback) { 
    fs 
      .readFile(
        filename, 
        'utf8', 
        function(err, data) { 
         if (err) { 
          return console.log(err); 
         } 
         var doc = libxml.parseXmlString(data); 
         var xpath = "/rss/channel/item[contains(translate(concat(title,description), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'" 
           + userquery + "')]"; 
         console.log(xpath); 
         var result = doc.find(xpath); 
         console.log(result); 
         result.forEach(function(item) { 
          xmlresult += item; 
          // console.log(item.text()); 
         }); 
         callback(); 
        }); 

} 

function respond(err) { 
    if(err!=null){ 
     console.log(err); 
    } 
    xmlresult += "</channel></rss>"; 
    console.log("sending back"); 
    //respond(xmlresult); 
    // response.set('Content-Type','text/xml').send(data); 
    response.write(xmlresult); 
    response.end(); 
} 

}