互斥提交

时间:2015-06-04 00:27:31

标签: javascript jquery python ajax

我有一个javascript,在“提交”事件中执行以下ajax调用(反过来触发python脚本),我现在的问题是“当一个提交事件正在进行时,如果有其他人点击 提交按钮这个ajax调用应该通知提交正在进行中“,有没有人遇到过这个问题?(有名字吗?),如何解决这个问题? 请建议..

$("#main_form").submit(function(event) {
       .....................

            $.ajax({
                dataType: "json",
                type: "POST",
                contentType: "application/json",//note the contentType definition
                url: "scripts/cherrypick.py",
                data: JSON.stringify(data_cp),
                //data: data_cp,
                error : function (xhr, ajaxOptions, thrownError){
                    console.log("cherypick fail");
                    console.log(response);      
                    console.log(response['returnArray']);
                    alert(xhr.status);
                    alert(thrownError); 
                },
                success: function(response){
                    console.log("cherypick sucess");
                    console.log(response);
                    console.log(response['returnArray']);
                    var return_array = response['returnArray'];
                    console.log(return_array['faillist'].length);
                    console.log(return_array['picklist'].length);       
                    for (var i = 0; i < ip_gerrits.length; ) {
                        for (var j = 0; j < return_array['faillist'].length; ) {
                            if (ip_gerrits[i] != return_array['faillist'][j] )
                                ipgerrits_pickuplist.push(ip_gerrits[i]);
                            j++;
                        }
                        i++;
                    }

2 个答案:

答案 0 :(得分:1)

好的,只要您想为所有用户同步请求处理,就应该在服务器端完成。我假设你的服务器端是Python,即使你没有在你的问题中添加相关的标签。我的偏好是C#和PHP,但在你的情况下我会做以下...

选项#1 - 会话

1)为Python添加或安装首选会话模块,群众建议使用Beaker

Python Module for Session Management

2)将AJAX请求发送到服务器端脚本

INFO [j.e.r.w.j.config] - Mojarra 2.2.11 ( 20150505-0732 https://svn.java.net/svn/mojarra~svn/tags/2.2.11@14688) ..... initialized.

3)此服务器端脚本将具有类似此代码的内容

$(form).submit(function(e) {

    var options = {
         url: "scripts/cherrypick.py"
    };

    $.ajax(options);

});

4)现在,如果您获得包含密钥&#34;处理&#34;的JSON,则在您的JS脚本中您可以向用户显示他需要等待直到第一个请求被处理的警告

选项#2 - 长轮询和彗星

此选项的描述可能需要更多的空间来描述,因此最好看一下这篇文章,它有相当不错的简洁示例和Python中长轮询的实现

http://blog.oddbit.com/2013/11/23/long-polling-with-ja/

这里的主要思想不是保持静态会话,而是使用无限循环,而不是根据某个状态变量发回不同的HTTP响应:

session_opts = {
    'session.type': 'file',
    'session.data_dir': './session/',
    'session.auto': True,
}

app = beaker.middleware.SessionMiddleware(bottle.app(), session_opts)

@hook('before_request')
def setup_request():
    request.session = request.environ['beaker.session']

@route('/cherrypick')
def index():
    if 'processing' in request.session:
        data = { 'procesing': request.session['processing'] }
        return data

    processor()

def processor():

    request.session['processing'] = 1

    # Do some processing here for the first request
    # When processing is done you can clear "state" variable in session

    del request.session['processing']
    request.session.modified = True

答案 1 :(得分:-1)

最简单的方法是关闭一个标志,指示正在进行某些处理:

var processing = false;   
$("#main_form").submit(function(event) {
    if (processing) {
        $("#some_notification_pane").text("hold on there, turbo!");
        return;
    }
    processing = true;
    ...
    $.ajax({
        ...
        error: function(xhr, ajaxOptions, thrownError) {
            ...
            processing = false;
        },
        success: function(response) {
            ...
            processing = false;
        }
    });
    ...
});

您可能还想在提交处理程序的开头(我有processing = true)禁用提交按钮,并在收到回复后重新启用它。