(显然这与 typescript 没有太大关系,只是示例代码是在 ts 中)。
import { createWriteStream, WriteStream } from "fs";
export class Util {
public static openWrite(path: string): Promise<WriteStream> {
return new Promise<WriteStream>((resolve, reject) => {
const result = createWriteStream(path);
const onError = (err: Error) => {
// How to remove both listeners here?
reject(err);
}
const onOpen = (fd: number) => {
// How to remove both listeners here?
resolve(result);
};
result.on("error", onError);
result.on("open", onOpen);
});
}
}
代码应该说明一切。我很难理解应该如何编写该函数,以便正确处理成功和失败场景,同时确保在一切完成后删除所有添加的事件处理程序。
当然,总是有可能调用removeAllListeners,但这对我来说看起来像是一种黑客行为。
最佳答案
我认为这是 finally
的一个很好的用例。
let onError, onOpen;
const result = createWriteStream(path);
return new Promise<WriteStream>((resolve, reject) => {
onError = (err: Error) => {
// How to remove both listeners here?
reject(err);
}
onOpen = (fd: number) => {
// How to remove both listeners here?
resolve(result);
};
result.on("error", onError);
result.on("open", onOpen);
}).finally(() => {
result.removeListener("error", onError);
result.removeListener("open", onOpen);
});
或者,如果您知道没有其他监听器已附加到 EventEmitter
,您可以按如下方式简化:
const result = createWriteStream(path);
return new Promise<WriteStream>((resolve, reject) => {
result.on("error", reject);
result.on("open", resolve);
}).then(() => {
return result;
}).finally(() => {
result.removeAllListeners("error");
result.removeAllListeners("open");
});
关于javascript - 如何正确删除多个事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48984367/