收藏
回答

wx.request流式返回的坑这么多吗?

1、RequestTask.onChunkReceived() 注册的函数在:开发者工具、安卓、iOS上均不运行。我以为代码问题,调试好久才发现在Mac真机调试时时没有问题的。已经是最简单的测试代码了,都不运行。

2、iOS、Mac真机环境没有TextDecoder构造函数,开发工具却又有。在Mac真机流式返回了,要转成字符串发现没有TextDecoder,试了iOS环境也没有,不应该啊,难道TextDecoder还要自己实现?

3、RequestTask.onChunkReceived() 流式返回,发现返回的ArrayBuffer的实际大小和Header中的Content-Length不一致,很多时候一个chunk的byteLength就比Content-Length值大了。我还怀疑是Content-Length错了。但同一个资源在浏览器端实际大小就Content-Length完全一样。

这些问题是在封装wx.request过程中发现的。没有遇到过的就不用说了,基本可以排除是代码的问题了。要么各种环境下官方没有对齐,要么是wx.request的bug。

机型:iPhone15 iOS17.3.1、MacBook Pro M1 系统版本Mac os 14.4 (23E214)

开发工具版本:(1.06.2402040 darwin-arm64)

调试基础库:2.33.0--3.4.0都试过

代码段(因分享大小限制,删除了TS类型文件,所以会报TS错,不影响运行):https://developers.weixin.qq.com/s/vORaygmO7AQG

onChunkReceived不运行的代码:

  originRequest(){
    const requestTask = wx.request({
      url: 'https://picsum.photos/340/195',
      enableChunked: true,
      success(res){
        console.log('success:', res)
      },
      fail(err){
        console.warn('fail:', err);
      }
    });
    requestTask.onHeadersReceived(h=>console.log('header', h))
    requestTask.onChunkReceived((chunk)=>console.log('chunk', chunk))
  }


Mac真机环境没有TextDecoder的报错:

Mac真机环境chunk和Content-Length不一致:

回答关注问题邀请回答
收藏

2 个回答

  • 社区技术运营专员--阳光
    社区技术运营专员--阳光
    04-08

    1.试了一下你的代码片段,不会回调onChunkReceived,但客户端声明用chunk,需要后台按chunk返回,我们才会回调,否则就还是按后台返回的数据正常回调的

    2.和网络接口无关

    3.大小不一致问题,Header中的Content-Length也是后台返回的,我们只是透传

    04-08
    有用
    回复 1
    • 小洋葱
      小洋葱
      04-10
      1、不是吧,chunk不就是流式返回嘛?并且在Mac端真机调试,onChunkReceived就会被触发啊,并且同样的接口在nodejs和浏览器端都是可以流式返回的,这怎么解释?

      2、和网络确实没关系。但onChunkReceived返回的ArrayBuffer要转为string,就需要TextDecoder类啊。

      3、Content-Length是后端返回的我知道。为了排除后端问题,接口就返回了一个图片。Header中的Content-Length值是实际大小,没有错。就是onChunkReceived返回的数据比实际图片大小大啊。并且同一个接口同一个图片在nodejs和浏览器端都是一致的。

      您也可以试试这个接口在浏览器和nodejs的表现嘛
      04-10
      回复
  • 小洋葱
    小洋葱
    04-07

    事实上问题1、2都处理了。

    目前解决方案:

    1、遇到onChunkReceived不运行就降级,不使用onChunkReceived。

    2、自己实现了TextDecoder,在不存在TextDecoder的环境中使用。

    3、但遇到第三个问题心态就爆炸了,onChunkReceived可靠性这么低,对开发者来说不可靠就等于没这个功能。完全不敢用啊!

    04-07
    有用
    回复
登录 后发表内容