javascript - DataReader.loadAsync fullføres selv når unconsumedBufferLength er 0
Jeg konsumerer JSON-strøm på UWP WinRT med denne koden:
async function connect() {
let stream: MSStream;
return new CancellableContext<void>(
async (context) => {
// this will be called immediately
stream = await context.queue(() => getStreamByXHR()); // returns ms-stream object
await consumeStream(stream);
},
{
revert: () => {
// this will be called when user cancels the task
stream.msClose();
}
}
).feed();
}
async function consumeStream(stream: MSStream) {
return new CancellableContext<void>(async (context) => {
const input = stream.msDetachStream() as Windows.Storage.Streams.IInputStream;
const reader = new Windows.Storage.Streams.DataReader(input);
reader.inputStreamOptions = Windows.Storage.Streams.InputStreamOptions.partial;
while (!context.canceled) {
const content = await consumeString(1000);
// ... some more codes
}
async function consumeString(count: number) {
await reader.loadAsync(count); // will throw when the stream gets closed
return reader.readString(reader.unconsumedBufferLength);
}
}).feed();
}
Her sier dokumentet om InputStreamOptions.partial:
Den asynkrone leseoperasjonen fullføres når en eller flere byte er tilgjengelige.
Men, reader.loadAsync fullføres selv når reader.unconsumedBufferLength er 0, og dette gir CPU-belastning. Er dette en API-feil, eller kan jeg forhindre denne oppførselen slik at loadAsync bare fullføres når unconsumedBufferLength er større enn 0?
PS: Her er et repro med ren JS: https://github.com/SaschaNaz/InputStreamOptionsBugRepro
Svar #1
Er dette en API-feil, eller kan jeg forhindre denne oppførselen slik at loadAsync kun fullføres når unconsumedBufferLength er større enn 0
Most sannsynlig fullføres det også på end of stream. Så i så fall vil unconsumedBufferLength være null og må tas i betraktning.
Faktisk viser eksemplet på https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datareader.aspx noe lignende (om enn ikke ved å bruke det alternativet):
// Once we have written the contents successfully we load the stream.
await dataReader.LoadAsync((uint)stream.Size);
var receivedStrings = "";
// Keep reading until we consume the complete stream.
while (dataReader.UnconsumedBufferLength > 0)
🌹
