抱歉我的英文。 我是JS初学者。我需要Meteor的帮助。 我尝试编写rss聚合器。 你能告诉我为什么这段代码对我来说不正常吗? rssContent始终未定义。 但是如果我在HTTP.call中尝试console.log(result.content),我会看到rss数据。 我需要在此文件中的另一个函数中传递rssContent来解析XML,但是我遇到了HTTP.call的问题
server.js代码:
var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];
var rssContent;
for (var i = 0; i < rssSources.length; i++) {
HTTP.call('GET', rssSources[i],
function(error, result) {
try {
rssContent = result.content;
} catch (e) {
console.log(e);
}
}
);
}
console.log(rssContent);
答案 0 :(得分:1)
您的rssContent
变量始终未定义,因为您在回调(异步)非阻塞方法中调用它。而不是回调方法,你必须使用同步(阻塞)方法。
我建议你,不要为全局变量赋值,只要你得到http请求的响应,就把数据直接插入到数据库中。
阻止示例: -
var rssSources = ['http://news.yandex.ru/auto.rss'],
parsedRss = [];
var rssContent = "";
for (var i = 0; i < rssSources.length; i++) {
var result = Meteor.http.call("GET", rssSources[i]);
if(result.statusCode == '200' && result.content){
rssContent += result.content;
}
}
console.log(rssContent);
非阻止示例: -
var rssSources = ['http://news.yandex.ru/auto.rss'],
for (var i = 0; i < rssSources.length; i++) {
HTTP.call('GET', rssSources[i],
function(error, result) {
try {
//HERE INSERT YOUR DATA INTO THE DATABASE.INSTEAD OF ASSIGNING THE VALUE TO GLOBAL VARIABLE.
} catch (e) {
console.log(e);
}
}
);
}
答案 1 :(得分:0)
在Meteor中有两种运行HTTP请求的方法。它默认同步运行。如果传递回调,它将异步运行。在这种情况下,假设这是服务器端代码,则更容易省略回调并将其视为同步(更不用说头痛IMO)。
var rssContent = [];
for (var i = 0; i < rssSources.length; i++) {
var result = HTTP.call('GET', rssSources[i]);
// error handling
resultContent.push(result);
}
我对处理同步版本的错误并不熟悉。你可以前往here for more details in their doc。