获取流 html 就像 ajax onprogress
fetch stream html like ajax onprogress
是否可以对此进行简单的简单修改?
目标是在收到 html 时“绘制”它。
可能的情况:php需要 5 到 8 秒来执行,并在处理时推送每个回显。
常规 fetch.then 是 WAITING 所有行开始渲染。
我希望它在数据进入时尽快开始呈现。
我的 nginx 关闭了输出缓冲区,这样每个回显都会被推送到浏览器行(我不必等待 php 完成就可以开始看到回显...)我在浏览器中点击这个 php,我看到所有行都出现了,但是 fetch 正在等待所有行。
这里是常规 fetch.then(工作但等待)
// when I call this : it ask the php, php works, once php finished => boom => html render to a div ;)
function fetchajax (phpurl,stuff1,divid) {
var pcache = (Math.floor(Math.random() * 100000000) + 1); // random value to avoid cache reading
var postix = []; // prepare array for post body
postix["somestuff1"] = encodeURIComponent(stuff1);
postix["somestuff2"] = encodeURIComponent("test2");
fetch(phpurl+"?pcache="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)), // transforms the array to be sent as body for the post request
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(function (response) { return response.text(); })
.then(function (html) { $("#"+divid).html(html); })
.catch( err => console.log() );
}
这里是我在那里找到的一些灵感 https://jakearchibald.com/2016/streams-ftw/ 但我不知道响应、结果中的哪一个 reader 我可以从中提取 html...
// I want this to STREAM or render as soon as data is received to a div
function fetchajax (phpurl,stuff1,divid) {
fetch("/templates/account_ajax/topnavisub/"+sub+".php?pcache="+pcache+"&fetchx="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)),
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(function(response) {
var reader = response.body.getReader();
var bytesReceived = 0;
reader.read().then(function processResult(result) {
if (result.done) { console.log("Fetch complete");return;}
bytesReceived += result.value.length;console.log(response,result,reader);
$("#"+divid+"_message").append('. ');
return reader.read().then(processResult);
});
});
}
有了这个,我在 php 的处理过程中看到了点;) 但是如何让文本或响应正文出现在那里?
你可以在那里看到这个例子https://jsbin.com/vuqasa/edit?js,console
:) 我找到了答案
感谢这 2 个链接
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
Uint8Array to string in Javascript
这里是混合测试
php 可以使用 CSS 和 javascript 推送任何 html 并且一旦到达 YAY 就可以执行 ;)
php 上的测试是 echo some html、echo '1'、sleep(3) 并重复几次。
当我触发“fetchsrteam”功能时,我看到每个回显都在直播,我不必等到 php 完成。这样我就可以看到正在发生的事情的反馈(很少但可能)长 php 从 API 检索信息、执行操作、计算等的脚本
** 我还在 IOS 和 Android 的 webviews 中测试了这个 ;)
function fetchsrteam ( divid , sub , buttonid ) {
var pcache = (Math.floor(Math.random() * 100000000) + 1);
var postix = [];
postix["preventCache"] = pcache;
postix["divid"] = encodeURIComponent(divid);
postix["buttonid"] = encodeURIComponent(buttonid);
fetch("/.........php?pcache="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)),
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(response => response.body)
.then(rb => {
const reader = rb.getReader();
return new ReadableStream({
start(controller) {
function push() {
reader.read().then( ({done, value}) => {
if (done) {
console.log('done', done); controller.close(); return;
}
controller.enqueue(value); $("#"+divid).append(new TextDecoder().decode(value)); push();
})
}
push();
}
});
});
}
神奇的是这一行 $("#"+divid).append(new TextDecoder().decode(value));
==>> new TextDecoder().decode(value)
包裹在 $("#id").append().....
玩得开心;)
是否可以对此进行简单的简单修改?
目标是在收到 html 时“绘制”它。
可能的情况:php需要 5 到 8 秒来执行,并在处理时推送每个回显。
常规 fetch.then 是 WAITING 所有行开始渲染。
我希望它在数据进入时尽快开始呈现。
我的 nginx 关闭了输出缓冲区,这样每个回显都会被推送到浏览器行(我不必等待 php 完成就可以开始看到回显...)我在浏览器中点击这个 php,我看到所有行都出现了,但是 fetch 正在等待所有行。
这里是常规 fetch.then(工作但等待)
// when I call this : it ask the php, php works, once php finished => boom => html render to a div ;)
function fetchajax (phpurl,stuff1,divid) {
var pcache = (Math.floor(Math.random() * 100000000) + 1); // random value to avoid cache reading
var postix = []; // prepare array for post body
postix["somestuff1"] = encodeURIComponent(stuff1);
postix["somestuff2"] = encodeURIComponent("test2");
fetch(phpurl+"?pcache="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)), // transforms the array to be sent as body for the post request
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(function (response) { return response.text(); })
.then(function (html) { $("#"+divid).html(html); })
.catch( err => console.log() );
}
这里是我在那里找到的一些灵感 https://jakearchibald.com/2016/streams-ftw/ 但我不知道响应、结果中的哪一个 reader 我可以从中提取 html...
// I want this to STREAM or render as soon as data is received to a div
function fetchajax (phpurl,stuff1,divid) {
fetch("/templates/account_ajax/topnavisub/"+sub+".php?pcache="+pcache+"&fetchx="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)),
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(function(response) {
var reader = response.body.getReader();
var bytesReceived = 0;
reader.read().then(function processResult(result) {
if (result.done) { console.log("Fetch complete");return;}
bytesReceived += result.value.length;console.log(response,result,reader);
$("#"+divid+"_message").append('. ');
return reader.read().then(processResult);
});
});
}
有了这个,我在 php 的处理过程中看到了点;) 但是如何让文本或响应正文出现在那里?
你可以在那里看到这个例子https://jsbin.com/vuqasa/edit?js,console
:) 我找到了答案
感谢这 2 个链接
https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
Uint8Array to string in Javascript
这里是混合测试
php 可以使用 CSS 和 javascript 推送任何 html 并且一旦到达 YAY 就可以执行 ;)
php 上的测试是 echo some html、echo '1'、sleep(3) 并重复几次。
当我触发“fetchsrteam”功能时,我看到每个回显都在直播,我不必等到 php 完成。这样我就可以看到正在发生的事情的反馈(很少但可能)长 php 从 API 检索信息、执行操作、计算等的脚本
** 我还在 IOS 和 Android 的 webviews 中测试了这个 ;)
function fetchsrteam ( divid , sub , buttonid ) {
var pcache = (Math.floor(Math.random() * 100000000) + 1);
var postix = [];
postix["preventCache"] = pcache;
postix["divid"] = encodeURIComponent(divid);
postix["buttonid"] = encodeURIComponent(buttonid);
fetch("/.........php?pcache="+pcache, {
method: "POST",
body: JSON.stringify(Object.assign({}, postix)),
headers: {"Content-type": "application/json; charset=UTF-8"}
}).then(response => response.body)
.then(rb => {
const reader = rb.getReader();
return new ReadableStream({
start(controller) {
function push() {
reader.read().then( ({done, value}) => {
if (done) {
console.log('done', done); controller.close(); return;
}
controller.enqueue(value); $("#"+divid).append(new TextDecoder().decode(value)); push();
})
}
push();
}
});
});
}
神奇的是这一行 $("#"+divid).append(new TextDecoder().decode(value));
==>> new TextDecoder().decode(value)
包裹在 $("#id").append().....
玩得开心;)