以下是该场景:我通过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。
答案 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调用完成之前它不会运行。