我有一个自动同步功能,它会发送CURL请求到我的设备。我需要对每个设备都执行此操作(大约有60个)。问题是:
- 如果通信成功,一切都正常。
- 但如果通信失败,网页将等待超时时间结束。因此,在这3-4分钟内,客户端会崩溃...我有重要的网格,这些网格停止在那3-4分钟内加载数据。
自动同步是一个javascript函数,它执行AJAX请求调用下面的php控制器。我该如何防止这种情况发生呢?我不知道还有什么尝试的办法... AJAX是异步的,所以我不明白为什么网页会停止。
控制器:
- 如果通信成功,一切都正常。
- 但如果通信失败,网页将等待超时时间结束。因此,在这3-4分钟内,客户端会崩溃...我有重要的网格,这些网格停止在那3-4分钟内加载数据。
自动同步是一个javascript函数,它执行AJAX请求调用下面的php控制器。我该如何防止这种情况发生呢?我不知道还有什么尝试的办法... AJAX是异步的,所以我不明白为什么网页会停止。
控制器:
$list = $panels_repository->getNetwork();
$thread = new PollingThread($list);
$thread->start();
$thread->join();
$result = $thread->result;
$resultLength = sizeof($result);
//...
线程:
class PollingThread extends Thread {
private $panels_list;
private $alarm_status;
public $result;
public function __construct($list) {
$this->panels_list = $list;
}
public function run() {
$panels_list = $this->panels_list;
$alarmsUpdated = array();
$panels = array();
foreach($panels_list as $panel) {
$alarms_list = $panel->getAlarmsList();
//Get updated alarms status
$panel->getDiagnosticStatus($alarms_list);
//Save the results
array_push($alarmsUpdated, $alarms_list);
}
$this->result = $alarmsUpdated;
}
获取诊断状态
$input = "<?xml version='1.0' encoding='ISO-8859-1'?>
<?getParameters message?>
<displayMLRequest xmlns='http://www.peek.se/DisplayML/' version='1.12'
dateTime='2008-01-10T15:09:51+02:00'>
<getParameters/>
</displayMLRequest>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //Set IP to communicate
//Set POST XML Input
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $input);
//Return response as string & TimeOuts
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
//Execute
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
Javascript:
$('#stations_tree').on('changed.jstree', function (e, data) {
//....
var dataObject = {
type: "Selected",
childrenID: childrenID_array,
parentsID: parentsID_array
};
$.ajax({
type: "POST",
url: "controllers/PanelsController/",
data: dataObject,
cache: false,
success: function ()
{
$("#dg_selected_stops").jsGrid("loadData");
$("#dg_selected_pids").jsGrid("loadData");
}
});
}).jstree({
plugins: ["checkbox", "state", "types"],
"types": {
"default": {
"icon" : false
}
},
core: {
data: {
url: "json/stations.json",
dataType: "json",
success: function () {
//Save Panels Network as session variable
var dataObject = {
type: "Network"
};
$.ajax({
type: "POST",
url: "controllers/PanelsController/",
data: dataObject,
cache: false,
success: function() {
//Get EquipmentStatus for each panel
var dataType = {
type: "Save"
};
$.ajax({
type: "POST",
url: "controllers/EquipmentStatusController/",
data: dataType,
cache: false,
success: function () {
//Status Unknown
changeTreeIcons();
loadAlarmsData();
polling();
}
});
}
});
}
}
}
});
函数轮询(Polling)- 当JS停止运行,直到超时
function polling() {
var dataObject = {
type: "Polling",
};
$.ajax({
type: 'POST',
url: "controllers/DatabaseController/",
data: dataObject,
success: function(response) {
//loadAlarmsData();
//changeTreeIcons();
}
});
编辑: 我已经检查过,如果在轮询开始后尝试进行AJAX请求,网页只会在php脚本完成后执行该请求。因此,阻碍的JS是使用ajax请求加载数据的表格。我该如何解决这个问题?