Задать вопрос

Как лучше реализовать несколько запросов через CORS (XMLHTTPRequest)?

Такая вот задача, есть два кроссдоменных post-запроса к одному и тому же серверу, но разных по требуемым данным (пока их два потом будет больше).

Если делать один запрос все хорошо, но если сразу запустить синхронно оба запроса, то они начинают конкурировать друг другом и срабатывает защита браузера, потому что был отправлен OPTION запрос с одним url и тут же за ним идет POST-запрос с другим url и он плюется что так нельзя.

Конечно в данном конкретном случае (первая загрузка приложения) можно эти запросы выставить по порядку и следующий выполнять только если предыдущий успешно завершил свою работу.

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

А есть какая-то библиотека или еще как-нибудь может можно ВСЕ кросс-доменные запросы ставить в очередь на исполнение, чтобы они всегда выполнялись по порядку постановки в очередь, тогда эта проблема никогда не возникнет и можно будет смело делать запросы по различным таймерам.

Или может я неправильно логику приложения строю, при первой инициализации приложения ведь в основном можно обойтись запросами GET и тогда можно не юзать CORS, а использовать JSONP, а post-запросы через CORS следить чтобы срабатывали только от действий пользователя, ведь он не сможет сразу нажать на несколько кнопок (при нажатии на первую появится overlay который закроет собой весь функционал пока не выполнится запрос)

Хотя если есть какая-то возможность выстраивать все запросы в очередь это было бы удобнее

UPDATE 1
вот сваял пример
$klein->respond(['GET', 'OPTIONS'], '/test1', function ($request, $response) {
            $response->header('Access-Control-Allow-Origin', '*');

            if ($request->method('get')) {
                $response->json(['result1' => 'success1']);
            } else {
                $response->send();
            }
        });


$.ajax({
    url: pathRoot + 'test1',
    type: 'GET',
    success: function(result, textStatus, jqXHR) {
        console.log(result);
    },
});


если выполнил js-код один раз, то получим ответ
Object {result1: "success1"}

а вот если этот же код поставит на выполнение два раза, т.е. послать синхронные запросы
$.ajax({
    url: pathRoot + 'test1',
    type: 'GET',
    success: function(result, textStatus, jqXHR) {
        console.log(result);
    },
});

$.ajax({
    url: pathRoot + 'test1',
    type: 'GET',
    success: function(result, textStatus, jqXHR) {
        console.log(result);
    },
});


тогда результат будет уже таким
1. Object {result1: "success1"} - первый запрос успешно выполнился
2. а вот второй уже пришел с ошибкой
GET app.localhost/test1?_=1472203984338
XMLHttpRequest cannot load app.localhost/test1?_=1472203984338. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'test.localhost' is therefore not allowed access. The response had HTTP status code 500.

НО иногда все срабатывает
Object {result1: "success1"}
Object {result1: "success1"}
  • Вопрос задан
  • 484 просмотра
Подписаться 1 Оценить 9 комментариев
Решения вопроса 1
@DimNS Автор вопроса
Причина в ДНК (( нашел хитрую ошибку в коде которая и давала ошибку 500, ошибка вылазила не каждый раз, так что все нормально с CORS
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
madmages
@madmages
Человек прямоходящий
используй jsonp
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы