我在JavaScript中发现了“对象”的概念。我正在制作一个RSS Parser,我有一个错误(评论)。
function MyParser (feed_url) { // Construct
"use strict";
this.feedUrl = feed_url;
this.pubArray = [];
if (typeof (this.init_ok) == 'undefined') {
MyParser.prototype.parse = function () {
"use strict";
var thisObj = this;
$.get(this.feedUrl, function (data, textStatus, jqXHR) {
if (textStatus == 'success') {
var xml = jqXHR.responseXML,
//lastBuildDate = new Date($(xml).find('lastBuildDate').text());
items = $(xml).find('item');
items.each(function () {
var pubSingle = thisObj.makeObj($(this).find('pubDate').text(),
$(this).find('link').text(),
$(this).find('title').text(),
$(this).find('description').text(),
$(this).find('encoded').text(),
$(this).find('commentRss').text(),
$(this).find('comments').last().text());
thisObj.pubArray.push(pubSingle);
});
console.log(thisObj.pubArray); // OK
}
}, 'xml');
console.log(this.pubArray); // Empty
return (this.pubArray);
};
MyParser.prototype.makeObj = function (pubDate, pubLink, pubTitle, pubDesc, pubContent, pubComCount, pubComLink) {
"use strict";
var pubSingle = {};
pubSingle.pubDate = new Date(pubDate);
pubSingle.pubLink = pubLink;
pubSingle.pubTitle = pubTitle;
pubSingle.pubDesc = pubDesc;
pubSingle.pubContent = pubContent;
pubSingle.pubComCount = pubComCount;
pubSingle.pubComLink = pubComLink;
return (pubSingle);
};
}
this.init_ok = true;
}
如果查看console.log()
,您会看到行// OK
正在正确输出我的数组。
但是后来,从$.get
返回时,我的数组是空的。
有没有人知道为什么,以及如何解决这个问题?
答案 0 :(得分:4)
这不是变量范围的问题。这里的问题是你正在使用异步流,而你没有正确思考流程。
让我解释一下:
当您执行.get
时,您将触发一个并行异步进程,该进程将从浏览器请求信息,但您的主程序流程仍在继续,因此当您转到“return
”语句时,您的数组尚未使用get方法的响应填充。
你应该在get回调中使用你的数组,而不是在它之外,因为你不能保证数组将拥有你需要的信息。
它有意义吗?
让我知道!
进一步说明
根据你的评论,你仍然在做这样的事情:
var results = MyParser(feed_url); //使用results.pubArray的代码
你不能这样做。即使你在.get
回调中设置了“pubArray”,你也会在调用MyParser
之后立即尝试使用pubArray,并且在调用.get
回调之前。
您需要做的是从.get
回调中调用您的程序逻辑的下一步...这是确保pubArray
充满适当数据的唯一方法。
我希望这更清楚。
答案 1 :(得分:3)
这是因为你的行
console.log(this.pubArray); // Empty
发出Ajax请求后直接调用;它还没有时间来获取数据。这条线
console.log(thisObj.pubArray); // OK
在Ajax回调中调用了,此时已经获取了数据。
答案 2 :(得分:0)
谢谢大家,特别是@Deleteman。
这是我做的:
$.get(this.feedUrl, 'xml').success(function () {
thisObj.handleAjax(arguments[0], arguments[1], arguments[2]);
$(document).trigger('MyParserDone');
}).error(function () {
$(document).trigger('MyParserFailed');
});
然后,当我输入“HandleAjax”时,我回到了我的对象上下文中,所以“this”指的是我的对象和正确的属性。唯一的“问题”是我必须设置一个监听器(MyParserDone)以确保解析完成。