我正在尝试了解 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/