在iOS上,JavaScript的 fetch流不能正常工作

移动开发 2026-07-09

我在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章