0

I'm writing a simple utility to handle the numerous JSON calls I have to make in my app, but the problem with the readJson function below is that it completes before the inner function that gets the Ajax has got the data, so it returns undefined. Can anyone point me to an existing answer to this issue, or offer any advice on how to better structure this function so that it doesn't return until the Ajax request is complete?

json_manager = { 
    thisJson:'',
    readJson:function(theFileName, thePathName) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(function(theJSON) { 
                json_manager.thisJson=theJSON;
        });
        return(json_manager.thisJson)
    },
        //more functions 
    }
4

2 回答 2

1

您可以序列化事物以便在函数返回之前完成 ajax 调用的唯一方法是使 ajax 调用同步。而且,不推荐这样做,因为它通常会给最终用户带来非常糟糕的用户体验,其中浏览器被锁定并且在您的 ajax 调用期间不处理事件。不要那样做。

除此之外,AJAX 中的“A”代表异步,您需要学习使用回调以异步方式进行编程,以执行需要 AAX 调用结果的工作。因为 Ajax 通常是异步的,所以您的readJson()函数将在 ajax 调用完成之前返回。因此,您不能在该函数中返回 ajax 调用的结果。

要重组您的代码以使用异步 ajax,您必须将所有需要结果的工作从$.getJSON()ajax 调用的成功/完成处理程序中调用,并将结果作为参数调用该回调函数。

你可以这样做:

json_manager = { 
    thisJson:'',
    readJson:function(theFileName, thePathName, successHandlerFn) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(function(theJSON) { 
                successHandlerFn(theJSON);
        });
    },
        //more functions 
}
于 2013-09-07T17:38:27.947 回答
1

您遇到了一个经典的异步问题。发生的事情是$.getJSON调用只不过是设置对服务器的调用。在当前执行的函数将控制权返回给浏览器之前,它不会真正执行调用。

在这种情况下,您必须构建代码以告知数据的去向,而不是询问数据。

像这样的东西:

json_manager = { 

    readJson:function(theFileName, thePathName, callback) {

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(callback);

    },
        //more functions 
}

然后你可以这样称呼它:

json_manager.readJson('file', 'path', function(data) {
   // do something with the returned json
});

这样,您就可以向readJson函数提供有关如何处理从服务器获取的数据的说明。

于 2013-09-07T17:40:26.177 回答