• 0
Divnenkiy

Асинхронный запрос и возврат результата

Вопрос

Здравствуйте.

Мучаюсь не первый день с такой проблемой.

Есть jquery, есть модальная форма, сначала мне нужно выполнить GET запрос на сервер, и в зависимости от того, что сервер ответит решить можно ли открывать форму или нет.

Если использоваться асинхронный запрос, то понятно, что форма откроется в любом случае. А если использовать синхронный то всё хорошо, но консоль браузера ругается, что я не правильно поступаю и мои методы Deprecated.

Как сейчас правильно поступать в современных тенденциях?

Для понимания что я хочу, изображу это примерно так:

function getAccess(){

  ... запрос GET на сервер

return ответ

}

function showModalWindow(){

если getAccess() то открываем форму

}

Не представляю как это вырулить асинхронно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

и

пример то приведите что сделано

16 минут назад, Divnenkiy сказал:

Если использоваться асинхронный запрос, то понятно, что форма откроется в любом случае.

с чего это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
var csrf_token = "";

function getToken() {
    $.ajax({
        url:'/admin/csrf-token/',
        type:'GET',
        dataType:'json',
        data: '',
        async: false,
        cache: false,
        timeout: 5000,
        success: function (data) {
            csrf_token = data['csrf-token'];
        },
        error: function(error) {
            console.log('Ошибка получения токена: ' + error.responseText);
        }
    });
}

$("#myModal").on("show.bs.modal", function(event) {

    getToken();
    var form = $("#myForm").serialize()

    $.ajax({
        url:'/admin/secretform',
        type:'POST',
        dataType:'json',
        data: form,
        async: true,
        cache: false,
        timeout: 5000,
        beforeSend: function(request) {
            return request.setRequestHeader('X-CSRF-TOKEN', csrf_token);
        },
        success: function (data) {
            $("#myModalLabel").text(data['title']);
            $("#name").val(data['name']);
            $("#email").val(data['email']);
        },
        error: function(error) {
            $(".modal-body").html('Ошибка обработки данных: ' + error.responseText);
        }
    });
});

В этом варианте работает. Но консоль говорит, что не по феншую поступаю. В JS живу всего неделю, поэтому сознание ещё не прижилось, сильно не ругайте.

Эм.. код немного не совпадает с задачей из 1 поста, но суть в том, что при открытии формы мне нужно обязательно дождаться завершения функции getToken(), чтобы в переменную csrf_token гарантированно встало значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

сори - я временно в больнице лежу)) поэтому  баги сами отлавливайте если будут.  самое главное уловите как эта хрень работать должна

Скрытый текст

var csrf_token = "";

function getToken(foo) {
    $.ajax({
            url:'/admin/csrf-token/',
            type:'GET',
            dataType:'json',
            data: '',
            cache: false,
            success: function (data) {
                csrf_token = data['csrf-token'];

                //проверяем передана ли функция. если да - выполняем её. ну и естественно сунем в неё полученные данные
                if (typeof foo == 'function') {
                    foo(data)
                }

            },
            error: function(error) {
                console.log('Ошибка получения токена: ' + error.responseText);
            }
        });
}
// клик по кнопке, а не при открытии
$("#myModal-btn").on("click", function(event) {

        $callback  = function(dataToken) {
            var form = $("#myForm").serialize(),
            modal  = $("#myModal");
            $.ajax({
                    url:'/admin/secretform',
                    type:'POST',
                    dataType:'json',
                    data: form,
                    cache: false,
                    beforeSend: function(request) {
                        return request.setRequestHeader('X-CSRF-TOKEN', csrf_token);
                    },
                    success: function (data) {
                        // здесь уже условия проверяйте и вызывайте окно когда надо
                        // modal.modal('show')
                        $("#myModalLabel").text(data['title']);
                        $("#name").val(data['name']);
                        $("#email").val(data['email']);
                    },
                    error: function(error) {
                        $(".modal-body").html('Ошибка обработки данных: ' + error.responseText);
                    }
                });
        }


        getToken($callback);

    });

 

Изменено пользователем Николя223

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, Николя223 сказал:

сори - я временно в больнице лежу))

Выздоравливай )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Olesiy
      Здравствуйте дорогие форумчане! Сделала всплывающую форму обратной связи на своем сайте, все работает,нормально, вот только после отправки письма форма не закрывается, нужно нажимать на крестик для закрытия. Как сделать так , что бы после успешной отправки форма сама закрывалась.Если кому не трудно подскажите ПОЖАЛУЙСТА. P.S в js не буб бум.
      Вот форма:
      <div class="popup"> <div class="popup-dialog">  <div class="popup-content">  <button class="popup-close"> &times;</button> <form  class="top" action="smart.php" method="POST"> <h4>Submit your application</h4> <label for="name"> Your  name<input type="text" name="name" value="" placeholder="name"></label> <label for="emeil"> Your e-meil<input type="text" name="e-meil" value="" placeholder="emeil" required></label> <label for="phone">Your Phone<input type="text" name="phone"  id="phone" value="" placeholder="phone"></label> <textarea name="comment" id="comment-field"  rows="4">comment</textarea> <button class="button-block button-btn" type="submit">  to order</button> </form> </div> </div> </div>  
      Вот скрипт отправки:
      $('form').submit(function(event) { event.preventDefault(); var th = $(this); $.ajax({ type: "POST", url: "smart.php", data:$(this).serialize() }).done(function() { $(this).find("input").val(""); alert("Спасибо за заявку!"); $("form").trigger("reset"); }); return false; }); И на всякий случай скрипт всплытия окна
      $(document).ready(function() { $('.popup-btn').on('click', function (event) { $('.popup').fadeIn();// к тому что нужно показать, fadeIn с анимацией }); $('.popup-close').on('click', function (event) { event.preventDefault(); $('.popup').fadeOut(); }); })  
    • Автор: Лелик
      Очень нужен фильтр товаров на ajax без БД. В интернете нашла подходящий пример. Могу провести всю рутинную работу (коей очень много) по наполнению фильтра. Есть проблемы:
      1. не знаю, как проверить его на ошибки, и
      2. не знаю, как встроить в сайт
      Прошу провести эти две работы. Для заинтересованного программиста пришлю более подробное описание ТЗ
    • Автор: cyklop77
      подскажите пожалуйста, что нужно сделать чтобы получить возможность использовать базу городов от КЛАДР? она выложена в общий доступ, но обратиться через ajax к ней невозможно потому что браузеры не разрешают кроссдоменные запросы
      когда бэкенд пишешь сам, то сам же и настраиваешь отдающий сервер в соответствии с CORS, но здесь не тот случай. однако, думаю, большинство разработчиков тянут данные из КЛАДР при помощи ajax. и.... я тоже хочу
      пока только придумал установить в хром расширение. но это временная мера - только для этапа разработки.

Карта разработчиков

Карта участников

Отметь себя на карте для поиска или предложения работы