2017-08-08 44 views
1

我是新來的nodejs。爲什麼模塊導出變量爲空?

這是我的.js文件。我試圖將audioData變量暴露給其他函數。 audioData變量值在函數外部是空的。當我在函數內部打印時,我看到了這個值。什麼可能是錯的?

'use strict'; 
var asyncrequest = require('request'); 
var xml2js = require('xml2js'); 
var parseString = xml2js.parseString; 
var audioData = []; 

asyncrequest("http://example.com/feed", function(error, responsemeta, body) { 

    parseString(body, function(err, result){ 
      var stories = result['rss']['channel'][0]['item']; 

      console.log("Total stories: " + stories.length); 

      stories.forEach(function(entry) { 
       var singleObj = {} 
       singleObj['title'] = entry['title'][0]; 
       singleObj['value'] = entry['enclosure'][0].$.url; 
       audioData.push(singleObj); 
      }); 
    }); 
    console.dir(audioData); 
}); 

module.exports = audioData; 
console.log("Program ended"); 
+1

您正在執行修改'audioData'的異步請求。該請求在變量被導出後運行*。因此,使用'require'的導入將檢索空數組。它將保持空白,直到請求完成。 – heartyporridge

+0

@heartyporridge IIRC'require()'是同步的,因此在導出空數組後,即使請求完成後它仍然保持這種方式 – spicypumpkin

+0

@spicypumpkin Hm ...但不需要返回引用?糾正我,如果我錯了,如果它被模塊更新,它會被需要它的人更新。 除非...每個'require'都爲導出的變量生成一個唯一的作用域? – heartyporridge

回答

0

您必須爲audioData返回承諾,而不是audioData本身!你可以在其他地方瞭解更多關於承諾令人高興的是有請求,請求承諾的promisified版本,您可以使用像這樣:

'use strict'; 

var rp = require('request-promise'); 
var xml2js = require('xml2js'); 
var parseString = xml2js.parseString; 
var audioData = []; 

var promiseForAudioData = rp('http://example.com/feed') 
    .then(body => { 
    parseString(body, function(err, result){ 
     var stories = result['rss']['channel'][0]['item']; 
     console.log("Total stories: " + stories.length); 

     stories.forEach(function(entry) { 
     var singleObj = {} 
     singleObj['title'] = entry['title'][0]; 
     singleObj['value'] = entry['enclosure'][0].$.url; 
     audioData.push(singleObj); 
     }); 
    }); 

    return audioData; 
    }) 
    .catch(console.error.bind(console)); 

module.exports = promiseForAudioData; 
console.log("Program ended"); 
0

如果你不想使用的承諾,您可以導出在回調內部或導出請求方法本身。

asyncrequest("http://example.com/feed", function(error, responsemeta, body) { 

    parseString(body, function(err, result){ 

    var stories = result['rss']['channel'][0]['item'];  
    console.log("Total stories: " + stories.length); 
    stories.forEach(function(entry) { 
     var singleObj = {} 
     singleObj['title'] = entry['title'][0]; 
     singleObj['value'] = entry['enclosure'][0].$.url; audioData.push(singleObj); 
    }); 
    module.exports = audioData; 

    }); 

}); 

// Or 
exports.get = function (callback) { 
    return asyncrequest(/* ... */, callback); 
} 

// Other module 
require("./module").get(function (audioData) { 
    /* Do something */ 
})