开发者

access a json string from outside the call back function that read it

var plane;

$.getJSON(sTailFileName, function(plane) {
    $('#upTailNum').html(plane.tailNum + '   ' + plane.airplaneType);
        document.title="Load " + plane.tailNum;
        ....  goes on for 300+ statements ....
});

and it works fine. However, what I want to do is something like:

var plane;

$.getJ开发者_如何学JAVASON(sTailFileName, function(plane) {});

$('#upTailNum').html(plane.tailNum + '   ' + plane.airplaneType);
document.title="Load " + plane.tailNum;

but that gives me a "plane undefined" message. I need to get at plane from outside the scope of the getJSON -- or at least want to. I've tried many things including $.proxy and through closures (which I don't yet really understand), but with no success thus far.

This is my first effort in Javascript/jQuery. I'm attempting to replace an old DOS program I originally wrote back in 1988. See http://terryliittschwager.com/WB/wbjs.html for details.

Any help will be greatly appreciated!

Terry Liittschwager


Your callback function to getJSON gets the plane value but doesn't do anything with it; so, when you do plane.tailNum, plane is still undefined because it was never assigned a value. Also, the getJSON call is asynchronous so you can't just do this:

$.getJSON(sTailFileName, function(x) { plane = x; });

because the plane = x will not have been executed (unless you get very lucky with the timing) when you try to access plane.tailNum.

You can replace the getJSON call with a synchronous $.ajax call and assign the JSON blob to plane in the success callback or keep doing things the first way. You can always put your "goes on for 300+ statements" in a separate named function, say, three_hundred_lines and refer to that by name:

function three_hundred_lines(plane) { /* ... */ }
$.getJSON(sTailFileName, three_hundred_lines);

if you don't want to inline a big pile of code.


The thing with AJAX calls is that they're asynchronous. You can access the returned value within the callback function because the callback function happens once the data is returned.

$.getJSON(); just fires off the request and returns immediately. Any code that immediately follows it will be executed before the json data returns.


The problem is that $.getJSON is an asyncronous method ie, the line $.getJSON(sTailFileName...) sends off the request but doesn't wait around for the result to be returned before continuing to the next line. The function that is supplied to $.getJSON is called once a response is recieved, which is almost certainly after the rest of the program has executed.

You shouldn't attempt to work around this. The callback function is the correct place to handle the response.


You are used to programming synchronously. You need to wrap any logic that uses the plane object in a function, and invoke that function from your getJSON callback. Something like this:

$.getJSON(sTailFileName, function(plane) {
    // pass "plane" along to some other function that does the work
    doStuff(plane);
});

The reason you are sending a function as an argument to getJSON is because you don't know when the response will be received.

Although I was born in 1988 when you were writing DOS programs, so if you want me to get off your lawn, I'm fine with that ;-)

-tjw

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜