Javascript 为什么模块导出变量为空?
我对nodejs是新手 这是我的.js文件。我正在尝试向其他函数公开audioData变量。audioData变量值在函数外部为空。我在函数内部打印时看到值。有什么不对劲吗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:
'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 IIRCrequire()
是同步的,因此在导出空数组之后,即使在请求完成之后,它也将保持这种状态completed@spicypumpkin陛下但是不需要返回引用吗?如果我错了,请纠正我,如果它由模块更新,则由需要它的人更新它。除非。。。每个require
都会为导出的变量生成一个唯一的作用域?@heartyporridge噢,你知道吗,我错了。它确实返回一个引用。My bad hahaYou正在执行一个修改音频数据的异步请求。此请求在导出变量后运行。因此,使用require
导入将检索空数组。在请求完成之前,它将保持为空。@HeartyPortridge IIRCrequire()
是同步的,因此在导出空数组之后,即使在请求完成之后,它也将保持这种状态completed@spicypumpkin陛下但是不需要返回引用吗?如果我错了,请纠正我,如果它由模块更新,则由需要它的人更新它。除非。。。每个require
都会为导出的变量生成一个唯一的作用域?@heartyporridge噢,你知道吗,我错了。它确实返回一个引用。我的坏哈哈