我正在尝试使用一个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作为会话存储不是可取的。因此,如果我使用文件作为会话存储,我仍然不知道如何解决它。
对此有任何想法吗?
答案 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都可以同时运行并且彼此独立。