我正在做一个数据导入使用php (Laravel),它有4-5个不同的统计表。
所以,我想要列出所有它们,以及每个产品的状态,无论是插入还是更新。
在ajax中有没有一种方法,我可以从服务器获取从服务器返回的字符串,它是逐行回显的?而不是在一切都完成后立即完成?
喜欢
开始..。
正在复制文件...
正在执行...
产品1 ..
产品2 ..
完成了..。
$.ajax({
url: "product-import.php",
type: 'POST',
data: new FormData(this),
dataType:'text',
contentType: false,
cache: false,
processData: false,
success: function (data) {
console.log(data);
$('#importStatus').append(data);
}
});发布于 2020-06-13 23:25:17
是的,但据我所知,jQuery Ajax没有提供公开它的应用程序接口。
fetch API支持流响应正文。响应对象的body有一个返回读取器的getReader方法。
每次在读取器上调用read()时,您都会得到一个promise,该promise解析为具有value和done状态的对象,因此您可以循环,直到done变为真值。
请注意,由于您得到的是字节流,因此需要decode them to text。
给定一个这样的测试脚本(请注意,一旦数据可用,它如何将数据发送到客户端,如果现有脚本缓冲了所有数据,则这将不起作用!):
<?php
$counter = 20;
while ($counter) {
echo $counter--;
ob_end_flush();
sleep(2);
}您可以像下面这样以流的形式访问响应:
<!DOCTYPE HTML>
<title>Stream Test</title>
<h1>Stream Test</title>
<script>
async function init() {
const response = await fetch("api.php");
const reader = await response.body.getReader();
let going = true;
while (going) {
const {value, done} = await reader.read();
const string = new TextDecoder("utf-8").decode(value);
if (done) {
going = false;
} else {
const paragraph = document.createElement("p");
const text = document.createTextNode(string);
paragraph.appendChild(text);
document.body.appendChild(paragraph);
}
}
}
init();
</script>请记住,此演示使用非常小的、间隔良好的数据块。更大的数据位很可能被分成更小的块,即使它们是紧密地一起到达的。您可能希望在客户端对它们进行缓冲,直到服务器发送一个显式的"end of section“令牌。
https://stackoverflow.com/questions/62361425
复制相似问题