• 0
Divnenkiy

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

Вопрос

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

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

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

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

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

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

function getAccess(){

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

return ответ

}

function showModalWindow(){

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

}

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

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


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

7 ответов на этот вопрос

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

  • 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 сказал:

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: cyklop77
      подскажите пожалуйста, что нужно сделать чтобы получить возможность использовать базу городов от КЛАДР? она выложена в общий доступ, но обратиться через ajax к ней невозможно потому что браузеры не разрешают кроссдоменные запросы
      когда бэкенд пишешь сам, то сам же и настраиваешь отдающий сервер в соответствии с CORS, но здесь не тот случай. однако, думаю, большинство разработчиков тянут данные из КЛАДР при помощи ajax. и.... я тоже хочу
      пока только придумал установить в хром расширение. но это временная мера - только для этапа разработки.
    • Автор: mightybat
      Добрый день.
      Есть форма(опросник), переменных на 200, подскажите как можно ее заполнить на компьютере1, и открыть на компьютере2 уже заполненную?
      Может быть есть человеческий способ, решения данной проблемы? 
      Вижу только вариант 1)сохранить все переменные в mysql 2)на втором компе вытащить из БД 3)воссоздать страницу HTML через echo( куча чекбоксов с oncliсk показывающими дивы, которые замучаюсь переписывать с block на none и наоборот).
    • Автор: cyklop77
      помогите пожалуйста получить ответ от ajax-запроса в angular2
      вот код сервиса:
      import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Observable'; @Injectable() export class RecordsService { constructor(private http: Http){ } getRecords(dateBeginUnix, dateEndUnix): Observable<any> { console.log(dateBeginUnix, dateEndUnix); let result = this.http.get('http://127.0.0.1:8000/days/' + dateBeginUnix + '/' + dateEndUnix); console.log('result', result); return result; } } вот код компонента(сокращённый):
      export class PanelComponent implements OnInit { constructor(private recordsService: RecordsService) { } private modelDateBegin: Object; private modelDateEnd: Object; private records: Object; private data: Object; displayStatistic() { this.recordsService .getRecords(this.modelDateBegin['epoc'], this.modelDateBegin['epoc']) .subscribe(data => this.records = data.json()); } } в сервис передаются 2 переменные:
      this.modelDateBegin['epoc'], this.modelDateBegin['epoc'] в них содержатся временные метки в юникс-формате. на основе этих меток бекенд выдаёт результат в виде json. проблема только в том, что в функции subscribe не происходит получение и присваивание полученного результата. соответственно я не могу результат отправить в шаблон для вывода
       
      при этом в консоли нет сообщений об ошибках. а выводится следующее:
      result Observable {_isScalar: false} ps:
      если в компоненте я заменяю строку:
      .subscribe(data => this.records = data.json()); на такую:
      .subscribe(data => this.records = data); , то в this.records следующее:
      содержится следующее:
      Response with status: 200 OK for URL: http://127.0.0.1:8000/days/1498856400/1498856400