从读取它的回调函数外部访问json字符串

时间:2011-04-08 02:58:02

标签: javascript jquery function callback scope

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

4 个答案:

答案 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