为什么模块导出变量为空?

时间:2017-08-08 22:15:29

标签: javascript node.js arraylist rss

我是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");

2 个答案:

答案 0 :(得分:0)

您必须返回audioData的承诺,而不是audioData本身!您可以在其他地方了解更多有关承诺令人高兴的是,您可以使用这样的请求,请求承诺的预定版本:

'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");

答案 1 :(得分:0)

如果您不想使用promises,可以在回调中导出或导出请求方法本身。

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 */
})