Ajax: функция для предотвращения выполнения ajax, если условие

В моем приложении php есть много функций ajax, например:

$.post('index.php?controller=suivi&action=ajax_intervention_save', {
            id: root.find('#id').val(),
            begin: begin,
            end: end,
        }, function(res) {
            //if is not an ID
            if (res && isNaN(res)) {
                error();
                SUIVI.showButton();
            } else {
                displaySuccess("Fiche saved");
            }
        });

И я хочу заблокировать доступ к своему приложению, когда у меня есть maintenance_mode == 1. Поэтому я добавляю это условие:

$.post('index.php?controller=suivi&action=ajax_intervention_save', {
            id: root.find('#id').val(),
            begin: begin,
            end: end,
        }, function(res) {
        if (res === 'MAINTENANCE'){
            error(res);
            return;
        }
            //if is not an ID
            if (res && isNaN(res)) {
                error();
                SUIVI.showButton();
            } else {
                displaySuccess("Fiche saved");
            }
        });

Моя проблема в том, что у меня много таких функций в других файлах. Как мне сделать, чтобы не копировать код res === 'ОБСЛУЖИВАНИЕ' во всех функциях? Мне нужен способ, который сообщает, что может отображать сообщение режима обслуживания для всех функций ajax, когда mode == 1

Это мое перенаправление index.php:

if (\app\models\Config::getValue('maintenance_mode')){
if (Tools::isAjax())
    die('MAINTENANCE');
elseif (!isset($_GET['action']) || $_GET['action'] !== 'maintenance'){
    header('Location:index.php?module=general&action=maintenance');
}

}

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
262
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

На мой взгляд, лучшим подходом было бы следующее: у вас была бы глобальная функция, которая ожидает URL-адрес, который должен быть вызван, и массив для информации, отправляемой с запросом.

Эта функция должна выполнять все ваши запросы ajax с введенной информацией. Затем вы бы изменили все свои вызовы ajax, которые вы еще реализовали, чтобы вызвать эту функцию.

С этим у вас будет одна единственная точка, где вы можете внести необходимые изменения.

Но я полагаю, что этот вопрос в первую очередь основан на мнении.

Спасибо за ответ, но это приведет к рефакторингу всего моего приложения и займет много времени. Вы можете дать мне экспресс-решение или идею?

prozbk 10.09.2018 17:48

До die() вы могли установить заголовок состояния, который не находится в диапазоне 200, и, таким образом, приводил бы к ошибке $.post и не вызывал его успешный обратный вызов.

header("HTTP/1.1 503 SERVICE UNAVAILABLE");
die('MAINTENANCE');

Затем используйте jQuery global ajaxError(), чтобы искать этот статус ошибки во всех запросах.


Пример использования сообщения в http://httpbin.org/, в котором есть тестовые маршруты для кодов состояния

// will see all ajax errors in page
$(document).ajaxError(function(event, xhr) {

  var maintenanceMessage = "SERVICE UNAVAILABLE" // default 503 message
  
  if (xhr.status === 503 && xhr.statusText === maintenanceMessage) {
    // do something to notify user of maintenance mode      
    console.info('Status::', [xhr.status, xhr.statusText])
  }
  // else ...do things for other errors also  
});

// make simple request in order to trigger error
var url = 'http://httpbin.org/status/503';
$.post(url, function() {
  console.info('Should not see this due to status code error')
})
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Обратите внимание, что существуют различные подходы к установке заголовков статуса с использованием php, см. https://stackoverflow.com/a/12018482/1175966

Если вы не хотите реорганизовывать весь остальной код, вы можете переопределить обратный вызов успеха. Вы можете сделать это, настроив глобальный обратный вызов beforeSend и изменив success, error или любые другие свойства обратного вызова переданного ему объекта options.

$.ajaxSetup({
  beforeSend:function(xhr,options){
    //save the original callback
    var original = options.success;

    //setup the new callback
    options.success = function(data){
      if (data == "MAINTENANCE"){
        error();
        return;
      }
      //call the original callback if no error
      original.apply(this,arguments);
    }
  }
})

Обратите внимание, что если вызовы ajax используют обратные вызовы обещаний, это не перехватит их. Так, например, если у вас было:

$.post().then(function(){
  //code
});

Ваш обратный вызов then() будет вызван, даже если у вас есть установка beforeSend.

Ответ принят как подходящий

Вы можете попробовать это:

if (res !== 'MAINTENANCE'){
$.post('index.php?controller=suivi&action=ajax_intervention_save', {
        id: root.find('#id').val(),
        begin: begin,
        end: end,
    }, function(res) {
        //if is not an ID
        if (res && isNaN(res)) {
            error();
            SUIVI.showButton();
        } else {
            displaySuccess("Fiche saved");
        }
    });
}

Другие вопросы по теме