2

我有以下代码:

$("#submit_financials").live('click', function(event){
    event.preventDefault();

    // using serialize here to pass the POST variables to the django view function
    var serialized_data = $("#financials_filter_form").serialize()

    $.post("/ajax/custom_filter/", serialized_data, function(response){
        // create a graph
    });
    $.post("/ajax/force_download/", serialized_data, function(response){
        alert('hello');
    });

});

但是,当我执行此代码时,我会在图表之前得到响应“你好”。为什么会这样?我将如何改变这一点,以便我首先得到图表?

4

3 回答 3

6

异步,你永远不知道哪个函数运行\先完成...

想想异步操作,比如告诉一群人跑 1 英里,你知道谁会先跑完吗?(是的,Jon skeet,然后是 Chuck Norris……)

您可以使用 a callack 来运行第二个 ajax:

$.post("/ajax/custom_filter/", serialized_data, function(response) {
    // create a graph
    ...
    ...

    $.post("/ajax/force_download/", serialized_data, function(response) {
        alert('hello');
    });
});​
于 2012-06-05T17:58:07.243 回答
5

您可以尝试使用延迟对象如果您想在警报之前生成图表但希望两个调用都完成

$.when (
   $.post("/ajax/custom_filter/", serialized_data),
   $.post("/ajax/force_download/", serialized_data)
).done(function(a1,  a2){
    /* a1 and a2 are arguments resolved for the 
    custom_filter and force_download post requests  */
   var customFilterResponse = a1[2]; 
   /* arguments are [ "success", statusText, jqXHR ] */

   //generate graph.

   alert('hello');
});
于 2012-06-05T18:03:51.750 回答
0

选项 1 是嵌套发布请求(gdoron 的响应)。如果这不可能/不切实际,您可以使用相互作用域的变量作为标志(更改响应回调函数中的值,然后使用 setTimeout 和递归(或 setInterval)继续寻找“标志”变量的变化以及何时你看到它改变了,然后弹出下一个 $.post 请求

于 2012-06-05T18:01:18.983 回答