WritableStream()写入流,将数字或字符流,写入你需要的地方

WritableStream有两个对象参数:
第一个必选,用于配置一些写入流时的钩子;
第二个可选,用于配置一些chunk入队和队列控制的策略;
第二个参数的策略(利用ByteLengthQueuingStrategy【按字节计量】和CountQueuingStrategy【按元素数量计量】接口去定义策略)两种

在第一个参数必选中,所有的对象字段都是可选的,可以单选,也可以全部,如下:
start(controller):在WritableStream对象完成构造后立即调用controller method执行一次
write(chunk,controller):每当一个新的chunk准备写入接收器的时候,将调用方法
close(controller):当结束写入流时候调用该方法
abort(reason):当写入流被中断或者写入流进入错误状态的时候,调用该方法

如下面的例子:
//写入流要插入的页面


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html charset=utf-8"/>
        
        <title>javascript写入流测试</title>
     
    </head>
    <body>
            
       <div id="stream">
            <ul id="listStream"></ul>
       </div>
    </body>
    <script type="text/javascript" src="test.js"></script>
       
</html>

//这里是上面html的javascript代码

//插入数字的异步函数
async function* ints(){
    for(let i=0;i<5;i++)
    {
        const textEncoder=new TextEncoder();
        const encodedText=textEncoder.encode(i);
        for(let x of encodedText)
        {
            yield await new Promise((resolve,reject)=>setTimeout(resolve,200,x));
        }
        
    }
}
//插入字符串的异步函数
async function* strs(str)
{
    for(let i=0,len=str.length;i<len;i++)
    {
        const textEncoder=new TextEncoder();
        const encodedText=textEncoder.encode(str[i]);
        for(let x of encodedText)
        {
            yield await new Promise((res,rej)=>setTimeout(res,100,x));
        }
    }
}

//解码二进制字符流
const decoder=new TextDecoder();
//这个是第二参数的可选策略,我们选按元素计量
const queuingStrategy=new CountQueuingStrategy({highWaterMark:1});
let result="";
//获取到我们在html页面中的容器元素
let list=document.getElementById('listStream');
//写入二进制流
const writableStream=new WritableStream(
    {
    //写入方法
        write(chunk)
        {
            return new Promise((resolve,reject)=>{
            //设置一个定型数组,在内存中分配一个字节
                const buffer=new ArrayBuffer(1);
                //设置一个无符号1个字节缓冲
                const view=new Uint8Array(buffer);
                //为1个字符赋值
                view[0]=chunk;
                //解码二进制文字或数字
                const decoded=decoder.decode(view,{stream:true});
                //创建元素
                const listItem=document.createElement('li');
                listItem.textContent=`Chunk decoded:${decoded}`;
                list.appendChild(listItem);
                //将所有解码的字符或数字串连起来
                result+=decoded;
                //完成期约
                resolve();
            });
        },
        //所有的字符流或数字流完成后关闭流
        close()
        {
            const listItem=document.createElement('li');
            listItem.textContent=`[message received]${result}`;
            list.appendChild(listItem);
        },
        //发生错误时
        abort(err)
        {
            console.error("sink error:",err);
        }

    },
    //写入流的第二个参数
    queuingStrategy,
);
//查看写入流锁的状态
console.log(writableStream.locked);
//getWriter()获得写入流的锁,锁定写入
const writableStreamDefaultWrite=writableStream.getWriter();
console.log(writableStream.locked);
//自闭异步函数执行写入操作,这里用的是字符串strs()函数,你可以用数字函数ints()
(async function(){
    for await (let chunk of strs('javascript ok'))
    {
        await writableStreamDefaultWrite.ready;
        writableStreamDefaultWrite.write(chunk);
    }
    writableStreamDefaultWrite.close();
})();

//最后输出是这样
Chunk decoded:j
Chunk decoded:a
Chunk decoded:v
Chunk decoded:a
Chunk decoded:s
Chunk decoded:c
Chunk decoded:r
Chunk decoded:i
Chunk decoded:p
Chunk decoded:t
Chunk decoded:
Chunk decoded:o
Chunk decoded:k
[message received]javascript ok

相关推荐

  1. 收到字符串写入xml并且这个xml写入.zip文件中

    2024-07-10 05:42:01       44 阅读
  2. Python数据写入Mysql

    2024-07-10 05:42:01       26 阅读
  3. WriteFlow写作GPT应用,激发创意写作助手

    2024-07-10 05:42:01       38 阅读
  4. Python传感器采集数据写入Mysql

    2024-07-10 05:42:01       20 阅读
  5. Python相机图像采集数据写入Redis

    2024-07-10 05:42:01       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 05:42:01       3 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 05:42:01       4 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 05:42:01       3 阅读
  4. Python语言-面向对象

    2024-07-10 05:42:01       2 阅读

热门阅读

  1. stm32使用双通道ADC读取

    2024-07-10 05:42:01       8 阅读
  2. kotlin typealias

    2024-07-10 05:42:01       10 阅读
  3. 如何做到高级Kotlin强化实战?(二)

    2024-07-10 05:42:01       8 阅读
  4. 力学笃行(四)Qt 线程与信号槽

    2024-07-10 05:42:01       10 阅读
  5. 【C/C++】VSCode 插件支持

    2024-07-10 05:42:01       10 阅读
  6. 华为HCIP Datacom H12-821 卷32

    2024-07-10 05:42:01       12 阅读
  7. Zookeeper底层原理

    2024-07-10 05:42:01       9 阅读