自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/cdcdhj/article/details/140310436

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!