Вызов нескольких ajax одновременно в Magento2 [Блокировка одновременных запросов в magento2]

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

checkPrgressVar = setInterval(checkPrgress, 1000);
importTaxes(importURL,cart_url,cart_token); 

/* check progress of imported data */
function checkPrgress()
{
            $.ajax({
                url: $(document).find("input[name='progressURL']").val(),
                type: 'POST',
                dataType: 'json',
               // showLoader: true,
                data: "action=import_store",
                complete: function(response) { debugger            
                    var response = response.responseJSON.output;

                },
                error: function (xhr, status, errorThrown) {
                    console.log('Error happens. Try again.');
                }
            });

}

/* import data  */
  function importTaxes(importURL,cart_url,cart_token)
  {
                $.ajax({
                    url: importURL,
                    type: 'POST',
                    dataType: 'json',
                    showLoader: true,
                    data: "cart_url="+cart_url+"&cart_token="+cart_token+"&action=import_tax",
                    complete: function(response) { debugger            
                        var response = response.responseJSON.output;
                        if(response.result == 'processing')
                        {

                        }
                        else
                        {

                        }         
                    },
                    error: function (xhr, status, errorThrown) {
                        console.log('Error happens. Try again.');
                    }
                });
 }

Мой checkProgress ajax возвращает ответ только после получения ответа от importTax ajax, в то время как этот checkProgress ajax должен быть независимым от importProgress ajax.

Однако оба ajax вызывают разные контроллеры, кажется, что magento не позволяет вызывать другой контроллер, пока он не обработает другой.

Я не знаю, почему это происходит и как это решить?

Я пробовал эту ссылку, но не работает.

Можно ли запустить несколько ajax запрашивает асинхронно в бэкенде Magento 2?

EDIT1: что я понял, если я вызову другой внешний URL-адрес вместо контроллера magento2 в вызове ajax checkProgress. он начал работать. Это означает, что magento2 не позволяет выполнять другой контроллер, пока другой работает через import ajax.

EDIT2- Оба ajax начали работать должным образом, если я изменил хранилище сеансов с «files» на «db» в файле env.php. Кажется, проблема с блокировкой сеанса, как описано в приведенной ниже ссылке:

Два одновременных запроса AJAX не будут выполняться параллельно

Но использовать БД в качестве хранилища сессий не желательно. Поэтому, если я использую файлы в качестве хранилища сеансов, я все еще не знаю, как это решить.

Есть какое-нибудь представление об этом?


person shashank    schedule 17.07.2018    source источник


Ответы (1)


Наконец-то я нашел его решения.

Основной причиной одновременного запуска обоих AJAX была проблема блокировки сеанса, как описано в приведенном ниже URL-адресе.

Два одновременных запроса AJAX не будут выполняться параллельно

но session_write_close() у меня не сработало. Итак, после исследований я нашел свое решение, и вот оно -

Я использовал Magento\Framework\Session\SaveHandler для закрытия и открытия сеанса в magento2.

Я загружаю этот класс в конструкцию в одном из моих файлов контроллера (который обрабатывает ajax) -

/**
 * @var \Magento\Framework\Session\SaveHandler
*/
protected $sessionHandler;

public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Framework\App\ResourceConnection $resourceConnection,
        \Magento\Framework\Session\SaveHandler $sessionHandler
    ) {
        parent::__construct($context);
        $this->resultJsonFactory = $resultJsonFactory;
        $this->resultPageFactory = $resultPageFactory;
        $this->connection = $resourceConnection;
        $this->sessionHandler = $sessionHandler;
    }

Затем в функции execute я закрыл и открыл сеанс следующим образом:

 public function execute()
 {
        $tmp_session_dir = ini_get("session.save_path");
        $this->sessionHandler->close();
        $this->sessionHandler->open($tmp_session_dir,"admin");

        // my code here

 }

ini_get("session.save_path") дает мне путь к каталогу на сервере, где сохранены файлы сеанса.

Теперь мои оба ajax работают одновременно и независимо друг от друга.

person shashank    schedule 18.07.2018