【问题标题】:Typescript async generator, for socketTypescript 异步生成器,用于套接字
【发布时间】:2018-01-21 05:47:24
【问题描述】:

我正在尝试了解 TS 异步生成器。

在 Node.js 中,我打开一个套接字,从中读取所有数据,然后关闭它。

我正在尝试将它变成一个异步生成器,用于处理数据块。

async function* connectAndRead() {
    const socket = net.connect(80, 'localhost');
    socket.on('data', data => ???);
    socket.on('end', socket.close());
}

可以为从套接字读取的数据创建一个异步生成器吗?

【问题讨论】:

    标签: node.js sockets typescript asynchronous generator


    【解决方案1】:

    有可能,在 Node.js 流自己实现异步迭代协议之前,这样的事情应该可以工作:

    import net from "net";
    
    async function* socketIterator(
        host: string, port: number, initialSend?: Buffer | string,
    ): AsyncIterableIterator<Buffer> {
        let ended: boolean = false;
        let error: Error | undefined;
        let wake: () => void;
    
        const socket = net.connect(port, host)
            .on("readable", () => { wake(); })
            .on("end", () => { ended = true; wake(); })
            .on("error", (err) => { error = err; wake(); });
    
        if (initialSend) {
            socket.write(initialSend);
        }
    
        try {
            for (;;) {
                // wait for next event on socket
                await new Promise<void>((res) => wake = res);
                // yield all data available on socket
                for (let chunk = socket.read(); chunk; chunk = socket.read()) {
                    yield chunk;
                }
                if (error) { throw error; }
                if (ended) { break; }
            }
        }
        finally {
            socket.end();
        }
    }
    
    async function main(): Promise<void> {
        const iter = socketIterator("httpbin.org", 80, "GET / HTTP/1.0\r\n\r\n");
        for await (const chunk of iter) {
            console.log(chunk.toString());
        }
    }
    
    main().catch(console.error);
    

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多