var plane;
$.getJSON(sTailFileName, function(plane) {
$('#upTailNum').html(plane.tailNum + ' ' + plane.airplaneType);
document.title="Load " + plane.tailNum;
.... goes on for 300+ statements ....
});
它工作正常。但是,我想要做的是:
var plane;
$.getJSON(sTailFileName, function(plane) {});
$('#upTailNum').html(plane.tailNum + ' ' + plane.airplaneType);
document.title="Load " + plane.tailNum;
但这给了我一个“飞机未定义”的消息。我需要从getJSON范围之外的飞机 - 或至少想要。我尝试了很多东西,包括$ .proxy和闭包(我还没有真正理解),但到目前为止还没有成功。
这是我在Javascript / jQuery中的第一次努力。我试图替换我最初在1988年写回的旧DOS程序。有关详细信息,请参阅http://terryliittschwager.com/WB/wbjs.html。
任何帮助将不胜感激!
Terry Liittschwager
答案 0 :(得分:0)
使用AJAX调用的是它们是异步的。您可以在回调函数中访问返回的值,因为一旦返回数据就会发生回调函数。
$.getJSON();
只会触发请求并立即返回。紧接着它的任何代码都将在 json数据返回之前执行。
答案 1 :(得分:0)
问题是$.getJSON
是 asyncronous 方法,即行$.getJSON(sTailFileName...)
发送请求但不等待结果为在继续下一行之前返回。一旦收到响应,就会调用提供给$.getJSON
的函数,这几乎可以肯定是在程序的其余部分执行之后。
你不应该试图解决这个问题。回调函数是处理响应的正确位置。
答案 2 :(得分:0)
getJSON
的回调函数获取plane
值但不对其执行任何操作;因此,当您执行plane.tailNum
时,plane
仍未定义,因为它从未分配过值。此外,getJSON
调用是异步的,因此不能执行此操作:
$.getJSON(sTailFileName, function(x) { plane = x; });
因为当您尝试访问plane = x
时,plane.tailNum
将不会被执行(除非您对时间非常满意)。
您可以使用同步$.ajax
调用替换getJSON
调用,并将JSON blob分配给plane
回调中的success
,或者继续执行第一种方式。你总是可以在一个单独的命名函数中使用“继续300多个语句”,例如three_hundred_lines
并按名称引用它:
function three_hundred_lines(plane) { /* ... */ }
$.getJSON(sTailFileName, three_hundred_lines);
如果您不想内联大量代码。
答案 3 :(得分:0)
您习惯于同步编程。您需要在函数中包装使用plane
对象的任何逻辑,并从getJSON
回调中调用该函数。像这样:
$.getJSON(sTailFileName, function(plane) {
// pass "plane" along to some other function that does the work
doStuff(plane);
});
您向function
发送getJSON
作为参数的原因是因为您不知道何时会收到回复。
虽然我出生于1988年,当时你正在编写DOS程序,所以如果你想让我从草坪上下来,我就可以了; - )
-tjw