node.js - typescript 异步生成器,用于套接字

标签 node.js sockets typescript asynchronous generator

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

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

我正在尝试将其变成一个基于数据 block 的异步生成器。

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

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

最佳答案

有可能,在 Node.js 流自己实现异步迭代协议(protocol)之前,这样的事情应该会起作用:

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);

关于node.js - typescript 异步生成器,用于套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656713/

相关文章:

javascript - Sinon,使用 Promise.reject() 到 stub.rejects() 观察不同的行为

node.js - 访问引用 Node.js 中的 Key Vault 的 Azure 应用程序配置设置

java - 在 Java 中完成 TLS 握手之前,accept() 是否返回?

Node.js - 如何计算 mongodb 中子文档的聚合(总和)?

javascript - 如何使 2 个 Javascript 变量始终彼此相等?

ruby - 测试 Ruby TCPSocket 服务器

c++ - Windows 中 SO_RCVBUF 的最大值?

angular - 如何对 4 个元素使用 ngFor?

typescript - 为什么 Typescript 的 "Omit"实用程序扩展了 any 为 "K"?

mysql - 发送数据库行列表(例如要在 Nodejs 中查看的对象)