我观察到,如果我增加 .NET C# 控制器方法之间的间隔,结果如下:-
await Task.Delay(100); // Slow down the Demo
每个服务器产量与 Javascript 对应 1:1:-
response.body.getReader() read()
但在全速下,结果会缓冲到 JSON 的“N”个字节块。
编辑2
我的问题是:
有人可以提供示例或相应文档的链接,说明 Javascript 处理来自 C# .NET IASyncEnumerable 控制器方法的 FETCH 响应的正确方法吗? 感谢您的阅读。
最终编辑请为其他人重新打开
我的问题是,如何复制以下提供的 C# 功能:-
JsonSerializer.DeserializeAsyncEnumerable
可以在 here 找到 Javascript 的示例?
以下 JS 被证明是非常健壮和有弹性的。
“默认”缓冲区大小似乎为 32KB,并且尚未经历不可预测或非规范/启发式可发现的撕裂。不知道缓冲是通过 System.Text.Json 还是 Kestrel 还是 HTTP。我也不知道刷新缓冲区之前的时间限制是多少,但大约是 0.3 秒。
我们可以在哪里拉动一些杠杆来配置/控制它?
async function nameFetch(elem, appender, abortSignal)
{
var reader,
result;
const decoder = new TextDecoder();
const abortControl = new AbortController();
const signal = abortControl.signal;
var canTimer = setTimeout(() =>
{
abortControl.abort();
console.log("*ABORTED*")
}, 2000); // Simulate a cancel
const fetchOpts = {signal:signal, method:'GET', cache:"no-cache"};
const response = await fetch("https://localhost:7196/data/yieldfamilyname?inname=" + encodeURIComponent(elem.value), fetchOpts).catch(
err => {
console.log(err.message);
});
if (!signal.aborted) {
reader = response.body.getReader();
result = await reader.read();
}
fetchLoop:
while (!signal.aborted && !result.done)
{
var personText = "[" + decoder.decode(result.value).replace(/\[|]/g, '').replace(/(^\s*,)|(,\s*$)/g, '') + "]";
console.log("*"+personText+"*");
var personArray;
try {
personArray = JSON.parse(personText);
} catch (err) {
personArray = [];
console.log("Failed to parse JSON Result " + err.message)
}
for (let i=0; i<personArray.length; i++)
{
if (signal.aborted) {
break fetchLoop;
}
var person = personArray[i];
person.familyName = decodeURIComponent(person.familyName);
console.log("chunk is", person.familyName);
appender.append(person.familyName, person.familyName);
}
try {
result = await reader.read();
}
catch (err) {
console.log(err.message);
break;
}
}
appender.close();
clearTimeout(canTimer);
if (reader !== undefined) {
reader.releaseLock();
}
}