У меня есть приложение codeigniter, которое принимает пользовательский ввод, использует JS для извлечения / POST ввода в контроллер, который обрабатывает его моделью. Модель должна отправлять обновления прогресса пользователю во время процесса, но кажется, что обещание получения захватывает все сообщения до того, как источник событий сможет их получить, и не будет отображать их, пока процесс не будет завершен.
Есть ли способ остановить выборку от скрытия всех сообщений источника событий? Или, может быть, поймать каждого и отобразить их по мере их поступления, а не до завершения процесса?
Мой индекс. php
<form id="form1">
<div class="form-group">
<label>Date From -></label>
<input type="text" class="form-control" name="date" id="magento-date" placeholder="2019-10-15 06:46:30">
</div>
<div class="form-group">
<label>Date To <-</label>
<input type="text" class="form-control" name="dateTo" id="magento-date-to" placeholder="2019-10-16 06:46:30">
</div>
<button id="submit" type="submit" class="btn btn-default">Submit</button>
</form>
<div class="progress progress-striped active">
<div class="progress-bar" id="progress" style="width:0%"></div>
</div>
<div id="message"></div>
<script>
document.querySelector("#submit").addEventListener("click", function(event) {
event.preventDefault();
const url = <?= "'".base_url('classic/classicFirearmByDate', 'http')."'"; ?>;
var myHeaders = new Headers();
const form = new FormData(document.querySelector('#form1'));
// The parameters we are gonna pass to the fetch function
let fetchData = {
method: 'POST',
headers: myHeaders,
body: new URLSearchParams(form)
}
//{method: "POST",header:myHeaders,body:{date:'2020baby'}}
fetch(url, fetchData, message())
.then((res) => res.text())
.then(text => console.log(text))
.catch((error) => console.log(error));
}, false);
function message() {
var evtSource = new EventSource(<?= "'".base_url('classic/classicFirearmByDate', 'http')."'"; ?> );
var eventList = document.querySelector('#message');
evtSource.onopen = function () {
console.log("Connection to server opened.");
};
evtSource.onmessage = function (e) {
console.log(e);
var newElement = document.getElementById("message");
newElement.textContent = "message: " + e.data;
// eventList.appendChild(newElement);
};
evtSource.onerror = function () {
console.log("EventSource failed.");
};
}
</script>
Мой контроллер. php
<?php
class Classic extends CI_Controller{
. . .
public function classicFirearmByDate() {
$data['title'] = 'Classic Firearms';
$sandbox = $this->input->post('sandbox');
. . .
$date = trim(htmlspecialchars($this->input->post('date')));
$dateTo = trim(htmlspecialchars($this->input->post('dateTo')));
$data['body'] = $this->classic_firearms->get_firearm_by_date($date, $dateTo, $sandbox, $this->input->post());
Моя модель. php
<?php
class Classic_firearms extends CI_Model{
. . .
public function get_firearm_by_date($date, $dateTo, $sandbox, $test) {
$this->sessionId = $this->login($sandbox);
$filter = array('complex_filter' => array(
array(
'key' => 'updated_at',
'value' => array(
'key' => 'from',
'value' => $date//'2019-10-03 09:44:30'//
),
),
array(
'key' => 'updated_at',
'value' => array(
'key' => 'to',
'value' => $dateTo//'2019-10-03 09:46:30'//
),
),
));
$productId = $this->proxy->catalogProductList($this->sessionId, $filter);
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
if ($productId != null || $productId != [] ) {
. . . //Many cURL requests and data conversion
echo 'data: Working on {$product_name} Product!', "\n\n";
// flush the output buffer and send echoed messages to the browser
flush();