使用jQuery从Web服务器获取数据

时间:2012-08-08 19:30:19

标签: python jquery webserver cherrypy

以下是该场景:我通过Web服务器从数据库获取数据。基于该数据页面向同一服务器发送另一个请求以执行某些操作。简化的结构如下:

var datacon;
$.post('method',function(data){
   datacon = data;
   // populating some tags;
}) // end of post
//some other staff happening;
$.post('other',{datacon}, function(env){
...// taking data from populated tags
   $("div").load(env);
...
}) // end of post

每次用户进入页面时都会发生这种情况。在打开页面时,如果datacon为空,则此代码不起作用。但如果我将刷新一次或两次,它就会开始工作。第二个.post工作完美,检查数百次。我用$ .get更改了第一个$ .post,但它没有帮助。

可能它涉及异步/同步调用。我不明白为什么会这样。请帮忙。

P.S。服务器是CherryPy。

2 个答案:

答案 0 :(得分:1)

回调函数是异步执行的,也就是说,一旦从服务器接收到数据。您的第二个POST可能会在返回第一个POST的响应之前执行。您可以将第一个帖子()更改为ajax()并将“async”设置为“false”。见http://api.jquery.com/jQuery.ajax/

以上是有点kludgy - 理想情况下,取决于AJAX调用结果的所有内容都应该放在回调方法中。例如,尝试在第一个POST的回调中移动第二个POST。像你试图做的标志设置可以被认为是代码气味。

答案 1 :(得分:1)

由于这些调用是异步的,因此第二个调用可能在第一个调用完成之前运行。要确保它们以正确的顺序运行,请将第二个ajax调用放在第一个结束时的done()函数中。这样,第二个只会在第一个完成时运行。

以下是我正在处理的项目中的示例:


    $("#leftcolumn").activity();
    $.ajax({
            type: "GET",
            url: "/search",
            cache: false,
            data: {searchterm: searchterm}
            }).done( function(reply) {
                $("#leftcolumn").activity(false);
                showSearchResults(reply);
                });

第一行显示屏幕上的进度指示器。然后ajax调用进行搜索。在.done的最后,我然后禁用我正在显示的进度指示器,然后显示搜索结果。将我想要执行的代码放在.done中可以保证在ajax调用完成之前它不会运行。