在django会话中处理异步ajax调用

时间:2015-07-08 09:25:37

标签: javascript ajax django asynchronous

我有一个Django应用程序,其中模板在javascript中包含for循环,它迭代某些表中的所有复选框。对于每个复选框,我向视图函数发送ajax请求,其中我想在列表中保存复选框的id或从列表中删除id(取决于检查状态)。我需要列表成为request.session字典的一部分。 结果显示,ajax调用是异步的,这使得我的列表被错误地更新,并且不一致。 是否有一些线程安全的数据结构,我可以将其存储为会话的一部分,并确保同步列表更新?

JavaScript和Ajax:

  "java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.example.foodiepipe.foodiepipe/com.example.foodiepipe.foodiepipe.MainActivity}: java.lang.NullPointerException\n\tat android.app.ActivityThread.deliverResults(ActivityThread.java:3500)\

查看功能:

function checkAll(source, type) {
            checkboxes = document.getElementsByName(type);
            for(var i=0, n=checkboxes.length;i<n;i++) {
                if (checkboxes[i].checked != source.checked) {
                    checkboxes[i].checked = source.checked;
                    select_row(checkboxes[i], source.checked);
                }
            }
        }

function select_row(row_selector, is_checked) {
            is_box_checked = typeof is_checked !== 'undefined' ? is_checked : row_selector.checked;
            request = {
                url: "{% url 'set_check_box' %}",
                type: "POST",
                contentType: "application/x-www-form-urlencoded",
                data: {
                    csrfmiddlewaretoken: "{{ csrf_token }}",
                    checked: is_box_checked,
                    check_box_id: row_selector.id,
                    type: row_selector.name
                },
                error: function(response, status, error_msg) {
                    console.log(error_msg);
                }
            };
            $.ajax(request);
        }

1 个答案:

答案 0 :(得分:1)

我所要做的就是将async选项设置为false作为请求参数的一部分。

function select_row(row_selector, is_checked) {
            is_box_checked = typeof is_checked !== 'undefined' ? is_checked : row_selector.checked;
            request = {
                url: "{% url 'set_check_box' %}",
                type: "POST",
                contentType: "application/x-www-form-urlencoded",
                async: false,
                data: {
                    csrfmiddlewaretoken: "{{ csrf_token }}",
                    checked: is_box_checked,
                    check_box_id: row_selector.id,
                    type: row_selector.name
                },
                error: function(response, status, error_msg) {
                    console.log(error_msg);
                }
            };
            $.ajax(request);
        }