使用jQuery从Web服务器获取数据
问题描述:
这里是场景:我通过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。
答
由于这些调用是异步的,第二次调用可能在第一次调用完成之前运行。为了确保它们以正确的顺序运行,将第二个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调用完成之前不会运行。
答
回调函数是异步执行的,也就是说,一旦从服务器接收到数据。您的第二个POST可能会在返回第一个POST的响应之前执行。您可以将您的第一篇文章()更改为ajax(),并将“异步”设置为“false”。请参阅http://api.jquery.com/jQuery.ajax/
虽然上述内容有点贵 - 理想情况下,取决于AJAX调用结果的所有内容都应在回调方法中进行。例如,尝试在第一个POST的回调中移动第二个POST。像你试图做的旗帜设置可以被认为是代码味道。
迈克,请您再解释一下吗?什么是done()函数? – 2012-08-08 19:51:30
我相信Mike的建议可以通过将第二个POST移动到第一个POST的回调函数中来实现。 – ach 2012-08-08 20:07:31
迈克,你太棒了。它确实有效。 – 2012-08-09 07:33:20