1

这是场景:我通过 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,但它没有帮助。

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

ps 服务器是 CherryPy。

4

2 回答 2

1

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

上面的内容有点笨拙——理想情况下,取决于 AJAX 调用结果的所有内容都应该放在回调方法中。例如,尝试将第二个 POST 移动到第一个回调的内部。像您尝试做的标志设置可能被认为是代码异味。

于 2012-08-08T19:35:17.193 回答
1

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

这是我正在从事的项目的示例:

    $("#leftcolumn").activity();
    $.ajax({
            类型:“获取”,
            网址:“/搜索”,
            缓存:假,
            数据:{搜索词:搜索词}
            }).done(函数(回复){
                $("#leftcolumn").activity(false);
                显示搜索结果(回复);
                });

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

于 2012-08-08T19:36:52.780 回答