2012-08-08 103 views
1

这里是场景:我通过Web服务器从数据库获取数据。根据该数据页面向同一服务器发送另一个请求以执行某些操作。简化结构如下:使用jQuery从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。

回答

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调用完成之前不会运行。

+0

迈克,请您再解释一下吗?什么是done()函数? – 2012-08-08 19:51:30

+2

我相信Mike的建议可以通过将第二个POST移动到第一个POST的回调函数中来实现。 – ach 2012-08-08 20:07:31

+0

迈克,你太棒了。它确实有效。 – 2012-08-09 07:33:20

1

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

虽然上述内容有点贵 - 理想情况下,取决于AJAX调用结果的所有内容都应在回调方法中进行。例如,尝试在第一个POST的回调中移动第二个POST。像你试图做的旗帜设置可以被认为是代码味道。