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

Javascript 为什么模块导出变量为空?,javascript,node.js,arraylist,rss,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:

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

您必须为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");

您必须为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");

如果不想使用承诺,可以在回调内部导出,也可以导出请求方法本身

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

如果不想使用承诺,可以在回调内部导出,也可以导出请求方法本身

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

您正在执行修改音频数据的异步请求。此请求在导出变量后运行。因此,使用
require
导入将检索空数组。在请求完成之前,它将保持为空。@HeartyPortridge IIRC
require()
是同步的,因此在导出空数组之后,即使在请求完成之后,它也将保持这种状态completed@spicypumpkin陛下但是
不需要返回引用吗?如果我错了,请纠正我,如果它由模块更新,则由
需要它的人更新它。除非。。。每个
require
都会为导出的变量生成一个唯一的作用域?@heartyporridge噢,你知道吗,我错了。它确实返回一个引用。My bad hahaYou正在执行一个修改
音频数据的异步请求。此请求在导出变量后运行。因此,使用
require
导入将检索空数组。在请求完成之前,它将保持为空。@HeartyPortridge IIRC
require()
是同步的,因此在导出空数组之后,即使在请求完成之后,它也将保持这种状态completed@spicypumpkin陛下但是
不需要返回引用吗?如果我错了,请纠正我,如果它由模块更新,则由
需要它的人更新它。除非。。。每个
require
都会为导出的变量生成一个唯一的作用域?@heartyporridge噢,你知道吗,我错了。它确实返回一个引用。我的坏哈哈