所以我在这里有这个JS代码,我试图从成功和错误回调中设置obj,但显然toLinkInfo
函数范围不是那些的父范围?无论怎样,我总是从这个函数中恢复。我尝试了很多东西,但无法让它工作,我想我已经习惯了C&朋友:)我怎么能让这个工作?
LinkInfoGrabber.prototype.toLinkInfo = function() {
var obj = null;
$.ajax({
url: this.getRequestUrl(),
success: function(raw) {
obj = new LinkInfo(raw);
},
error: function(jqXHR, textStatus, errorThrown) {
obj = new LinkInfoException(jqXHR, textStatus, errorThrown);
},
dataType: 'html'
});
if (obj instanceof LinkInfo) {
return obj;
} else {
throw obj;
}
}
答案 0 :(得分:3)
此代码:
if (obj instanceof LinkInfo) {
return obj;
} else {
throw obj;
}
在启动ajax调用后,立即运行,但在ajax调用成功完成之前,不会设置obj。这是一种常见的误解。 Ajax调用是异步的。您对$ .ajax()的调用启动异步调用,然后立即执行函数的其余部分。仅当ajax调用成功(稍后)时才调用成功处理程序。你不能从你的函数返回obj。您必须在成功处理程序中处理obj,然后再调用想要从成功处理程序中使用它的任何内容。
答案 1 :(得分:3)
这是因为AJAX调用是异步的 - 它们发生在与其他上下文不同的时间。
尝试给它一个回调函数(下面称为回调函数)。
LinkInfoGrabber.prototype.toLinkInfo = function(callback) {
$.ajax({
url: this.getRequestUrl(),
success: function(raw) {
callback( new LinkInfo(raw) );
},
error: function(jqXHR, textStatus, errorThrown) {
obj = new LinkInfoException(jqXHR, textStatus, errorThrown);
},
dataType: 'html'
});
}
var l = new LinkInfoGrabber()
l.toLinkInfo(console.log) //replace console.log with something meaningful
虽然这种方法不能提供与内联调用内容完全相同的结果,但它具有允许Web异步性的好处。
答案 2 :(得分:0)
在调用obj
之前返回ajax
,因此在返回时它不会设置为null。