javascript - 如何正确删除多个事件监听器?

标签 javascript node.js typescript

(显然这与 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/

相关文章:

javascript - 如何将我的本地 javascript 变量设置为远程网站上的 json 数据

javascript - 在对象上使用 .map() 从不同的父键获取值

javascript - 我如何在限制堆栈深度的同时链接许多顺序 promise ?

node.js - Lumen (Laravel) 与 NODE.JS 解决方案

javascript - 简单的 Nodejs Web 服务器总是发送文本/纯 css 和 js 文件

TypeScript,如何输入将 Promise<T>[] 转换为 Promise<T[]> 的函数?

javascript - Angular2 - 如何在按键时更改选定的 <select> 元素选项?

typescript type is not assignable to type `symbol` 错误

javascript - 第三次 onPageClick 事件后使用 twbspagination 插件和 AJAX 更新的 JS 分页

node.js - Socket.io 发出欢迎来到 socket.io 消息