Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 延迟函数返回直到Ajax请求完成_Jquery_Ajax_Json - Fatal编程技术网

Jquery 延迟函数返回直到Ajax请求完成

Jquery 延迟函数返回直到Ajax请求完成,jquery,ajax,json,Jquery,Ajax,Json,我正在编写一个简单的实用程序来处理我必须在我的应用程序中进行的大量JSON调用,但是下面readJson函数的问题是,它在获取Ajax的内部函数获取数据之前完成,因此它返回未定义的值。有没有人能告诉我这个问题的现有答案,或者就如何更好地构造这个函数提供一些建议,使它在Ajax请求完成之前不会返回 json_manager = { thisJson:'', readJson:function(theFileName, thePathName) { var the

我正在编写一个简单的实用程序来处理我必须在我的应用程序中进行的大量JSON调用,但是下面readJson函数的问题是,它在获取Ajax的内部函数获取数据之前完成,因此它返回未定义的值。有没有人能告诉我这个问题的现有答案,或者就如何更好地构造这个函数提供一些建议,使它在Ajax请求完成之前不会返回

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 
    }

唯一可以序列化的方法是使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 
}
json_manager = { 

    readJson:function(theFileName, thePathName, callback) {

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

    },
        //more functions 
}

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

在这种情况下,您必须构造代码来告诉数据去哪里,而不是询问数据

大概是这样的:

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

        var theUrl=(thePathName+theFileName);
        $.getJSON(theUrl).done(function(theJSON) { 
                successHandlerFn(theJSON);
        });
    },
        //more functions 
}
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
函数提供了如何处理从服务器获取的数据的说明。

谢谢您,rossipedia-工作得很好-还有一个很好的解释-我很感激。谢谢-是的,我理解异步问题-只是没有办法解决它-我也会检查一下-看起来像是一个类似于我接受的解决方案,所以+1:)