js 中streamApi是个较少用到的api,该api用于解决如何消费有序的小信息块的问题,stream也就是流在使用中存在三种情况
1、流出口处理数据速度大于流入口提供数据速度(流出口偶尔闲置,可以接受)
2、流出口处理数据速度与流入口提供数据速度基本持平(理想状态)
3、流出口处理数据速度小于流入口提供数据速度(数据积压)
流中有一个内部队列用于解决数据积压的问题,然而数据积压有上限,当达到上限会使用反压通知流入口停止发送数据。
stream中有三种流:可读流、可写流、转换流
1、可读流
const readableStream = new ReadableStream({
start(controller){
controller.enqueue(将数据传入可读流)
controller.close()
}
})
通过创建可读流的实例,并在构造函数中underlyingSource参数(第一个参数)中定义start方法,方法中使用controller作为参数,controller的enqueue方法可以将值传入控制器,当传完数据后使用close关闭流
const reader = readableStream.getReader()
reader.read() // 读取数据
通过流实例的getReader方法获取读取器,流实例中有一个locked属性,该属性用于给流上锁,当获取读取器后locked的值会变为true,保证该流只能当前读取器能读取。
2、可写流
const writeableStream = new WriteableStream({
write(value){
}
})
通过创建可写流的实例,并在构造函数中underlyingSink参数(第一个参数)中定义write方法,通过实现write方法可以获取写入的数据
const writer =writeableStream.getWriter()
await writer.ready;
writer.write() // 读取数据
writer.close()
通过流实例的getWriter方法获取写入器,流实例中有一个locked属性,该属性用于给流上锁,当获取读取器后locked的值会变为true,保证该流只能当前写入器能写入。writer.ready会返回一个promise,该promise在能够向流中写入数据时resolve.
3、转换流
const {writeable,readable} = new TransformStream({
transform(chunk,controller){
controller.enqueue(chunk) // chunk是要传入流的数据
}
})
通过创建转换的实例,并在构造函数第一个参数中定义transform方法
readable.getReader()
await writeable.ready
writeable.getWriter()
转换流类似于前两种流的结合