为什么模块导出变量为空?
问题描述:
我是新来的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本身!你可以在其他地方了解更多关于承诺令人高兴的是有请求,请求承诺的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");
答
如果你不想使用的承诺,您可以导出在回调内部或导出请求方法本身。
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 */
})
您正在执行修改'audioData'的异步请求。该请求在变量被导出后运行*。因此,使用'require'的导入将检索空数组。它将保持空白,直到请求完成。 – heartyporridge
@heartyporridge IIRC'require()'是同步的,因此在导出空数组后,即使请求完成后它仍然保持这种方式 – spicypumpkin
@spicypumpkin Hm ...但不需要返回引用?纠正我,如果我错了,如果它被模块更新,它会被需要它的人更新。 除非...每个'require'都为导出的变量生成一个唯一的作用域? – heartyporridge