在iOS上,JavaScript的 fetch流不能正常工作
我在iOS上尝试读取来自我的API的流式响应(具体是Safari,但看起来在iOS的任何浏览器都存在同样的问题)。
问题似乎出现在尝试读取流时,在这种情况下:
for await (const byteArray of stream) {
...
}
在iOS上会抛出如下异常:
TypeError: undefined is not a function (near '...byteArray of stream...')
据我所知,流在所有环境中都是一个 ReadableStream。但存在差异,我还弄不清楚原因,也不知道该如何处理。
在iOS中它表现为:
ReadableStream
locked: false
ReadableStream Prototype
cancel(reason)
constructor: function()
getReader()
locked
pipeThrough(dest, options)
pipeTo(streams, options)
tee()
Symbol(Symbol.toStringTag): "ReadableStream"
Object Prototype
在Windows:
ReadableStream {locked: false}
locked: false
[[Prototype]]: ReadableStream
cancel: ƒ cancel()
getReader: ƒ getReader()
locked: (…)
pipeThrough: ƒ pipeThrough()
pipeTo: ƒ pipeTo()
tee: ƒ tee()
values: ƒ values()
constructor: ƒ ReadableStream()
Symbol(Symbol.asyncIterator): ƒ values()
Symbol(Symbol.toStringTag): "ReadableStream"
get locked: ƒ locked()
[[Prototype]]: Object
看来iOS的版本似乎不可迭代,这可以解释问题所在,但我仍然不明白原因,也不知道正确的读取流的方式应该是怎样。
解决方案
Safari在 ReadableStream中加入了 [Symbol.asyncIterator],这功能在 Safari 26.4 版本中引入,截至目前仍然只在Technology Preview版本中,而不是在稳定版本中。
你可以在Mattias Buelens的 gist找到一个polyfill,链接是 https://gist.github.com/MattiasBuelens/496fc1d37adb50a733edd43853f2f60e(我在用,效果很好)。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。