在使用 ChatGPT 时一直都好奇它生成答案的动画效果是怎么做的,今天我们就简单的来模拟下。
先上效果:
我们先准备一下接口,代码如下:
1 | const express = require('express') |
可以看到,/ai
接口数据会以分块传输的方式返回。
我们在前端试着请求一下:
1 | fetch('/ai') |
然而,测试发现要等到数据全部传输完才会打印。怎么才能提前读取已经传输好的数据块呢?答案就是 ReadableStream。上面代码中,rsp
上的 body
属性其实就是 ReadableStream
对象,可以调用它的 getReader()
方法返回一个 reader
来读取数据,所以我们稍加改造一下就可以了:
1 | fetch('/ai') |
好了,关键的数据读取部分搞定了,前端效果部分就不详细介绍了,完整代码如下:
1 | <h2>Fake Chat GPT</h2> |