2015-06-04 2 views
2

У меня есть 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++; 
        } 
+0

1.Просто предложение - отправьте запрос 1, сервер начинает обработку и создает новую переменную состояния в сеансе, когда запрос 2 приходит в сервер, проверяет это состояние, если он активен - возвращает некоторый код ошибки в JS, когда выполняется запрос 1, состояние сеанса удаляется, а сервер снова открыт для обработки 2. Есть несколько таких технологий, как Comet и Long Polling, короче - JS отправляет запросы на сервер, который находится в бесконечном цикле и, таким образом, может заморозить запрос или отправить что-то обратно клиенту - http: // stackoverflow.com/questions/1991427/server-push-comet-vs-ape – Anonymous

+0

@ Andy - Есть примеры примеров того, как эти методы реализованы? Как запустить переменную состояния, как проверить состояние сервера, как удалить состояние сеанса и т.д..,? –

ответ

1

Хорошо, если вы хотите синхронизировать обработку запросов для всех пользователей, это должно быть сделано на стороне сервера. Я предполагаю, что ваша серверная сторона - это Python, даже если вы не добавили соответствующий тег в свой вопрос. Мои предпочтения C# и PHP, но в вашем случае я хотел бы сделать следующее ...

Опции # 1 - Сессия

1) добавить или установить предпочтительный модуль сеанса для Python, толпа рекомендует использовать Beaker

Python Module for Session Management

2) отправить запрос AJAX на стороне сервера скрипт

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

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

    $.ajax(options); 

}); 

3) этот сервер скрипт будет иметь что-то вроде этого кода

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 

4) Теперь в вашем JS скрипте, если вы получите JSON, который содержит ключ «обработку» можешь показать предупреждение пользователя, что он должен ждать, пока первый запрос не будет обработан

Вариант # 2 - Длинный опрос и Comet

Описание этой опции может занять гораздо больше места, чтобы описать, что он лучше смотреть на эту статью, он имеет довольно приятный и чистый пример и осуществление длительного опроса в Python

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

основной i dea здесь не для того, чтобы сохранять статическую сессию, а использовать бесконечный цикл вместо этого, который может отправлять обратно разные ответы HTTP в зависимости от некоторой переменной состояния:

@route('/cherrypick') 
def index(): 

    while True : 

     response = { 'processing': processing } 
     print response 

     if processing != 1 : 
      processing = 1 
      # Do some processing 
      processing = 0 

     sleep(5) 
+0

Что означает '@hook ('before_request')' и '@route ('/ cherrypick')' означает? – user2125827

+0

@hook ('before_request') - предполагается выполнить какое-либо действие перед каждым запросом, в этом случае - начать сеанс, иначе вам нужно будет начать сеанс в каждом методе, @route ('/ cherrypick') - означает, что все запросы, которые этот URL будет обрабатываться методом index() – Anonymous

+0

, вы можете изменить @route ('cherrypick') на что-то вроде @route ('scripts/cherrypick.py') или @route ('/ ajax-handler') или @ route ('/ server-script') - это URL-адрес, по которому вы будете отправлять данные в AJAX – Anonymous

-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) и снова включите его после получения ответа.

+0

действительно ли это работает, когда два пользователя пытаются щелкнуть кнопку «отправить» на двух разных браузерах? У другого экземпляра ajax-вызова есть информация о переменной 'processing'? –

+0

OH, я не понимал, что его нужно блокировать для всех пользователей. Это сложнее. Гектометр –

+0

@@ all - Любые другие материалы для людей, которые смотрят? –

Смежные вопросы