在Magento2中同时调用多个ajax [在magento2中并发请求阻止]

时间:2018-07-17 09:06:29

标签: ajax magento2.1

我正在尝试使用一个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不允许在处理另一个控制器之前调用另一个控制器。

我不知道为什么会发生以及如何解决?

我已经尝试了此链接,但无法正常工作。

Is it possible to fire multiple ajax requests asynchronously in Magento 2 backend?

EDIT1:我发现,如果我在checkProgress ajax调用中调用了另一个外部URL而不是magento2控制器。它开始工作。这意味着magento2不允许通过导入ajax运行另一个控制器时执行另一个控制器。

EDIT2-如果我将会话存储从 env.php 文件中的“文件”更改为“ db”,则两个ajax都可以正常工作。似乎存在会话阻止问题,如以下链接中所述-

Two simultaneous AJAX requests won't run in parallel

但是使用DB作为会话存储不是可取的。因此,如果我使用文件作为会话存储,我仍然不知道如何解决它。

对此有任何想法吗?

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案。

不能同时运行两个AJAX的主要原因是会话阻止问题,如下面的URL所述。

Two simultaneous AJAX requests won't run in parallel

但是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都可以同时运行并且彼此独立。