0

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

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

我已经尝试过这个链接,但没有工作。

是否可以在 Magento 2 后端异步触发多个 ajax 请求?

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

EDIT2-如果我将env.php文件中的会话存储从“文件”更改为“db”,则两个 ajax 都开始按预期工作。这似乎是一个会话阻塞问题,如下面的链接所述 -

两个同时的 AJAX 请求不会并行运行

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

有任何想法吗?

4

1 回答 1

0

最后我想出了它的解决方案。

没有同时运行两个 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同时运行并且彼此独立。

于 2018-07-18T13:02:50.873 回答