【问题标题】:ES6/Redux: returning a function to remove event listenerES6/Redux:返回一个函数来移除事件监听器
【发布时间】:2016-05-20 04:33:57
【问题描述】:

我正在观看 Dan Abramov 关于 Egghead 的 Redux 教程,他做了一些让我有些困惑的事情。作为一项学习练习,他让观众重建createStore 抽象。 createStore 提供的一种方法是 subscribe,它添加了侦听器以侦听存储更改。

然后他说:

这里有一个重要的缺失部分。我们还没有提供取消订阅侦听器的方法。我们不会添加专用的 Unsubscribe 方法,而是从 Subscribe 方法返回一个函数,该函数会从侦听器的数组中删除此侦听器。

所以他用来添加/删除监听器的代码是:

const subscribe = (listener) => {
  listeners.push(listener);
  return () => {
    listeners = listeners.filter(l => l !== listener);
  };
};

我有点理解,这允许您使用一个函数来添加/删除,这是可能的,因为如果您将已订阅的侦听器的名称传递给 subscribe 方法,过滤器将删除它,我明白为什么这会返回一个箭头函数而不是一个侦听器数组。这个返回的函数将如何/何时被调用?

【问题讨论】:

    标签: javascript ecmascript-6 redux


    【解决方案1】:

    如何/何时调用这个返回的函数?

    当侦听器应该被移除时调用这个函数。这应该在什么时候发生取决于应用程序。

    调用很简单:

    const remove = subscribe(myListener);
    // later:
    remove();
    

    我不明白为什么这会返回一个箭头函数而不是一个侦听器数组。

    这将允许任何订阅者与侦听器数组混淆,或者要求每个订阅者实现相同的取消订阅逻辑。

    【讨论】:

    • 只是想补充一点,这是一种非常常见的方法。例如,看看 AngularJS $scope.$on() 函数是如何工作的。它为侦听器返回一个注销函数。
    • 谢谢,这是一个很好的解释,也是我以前从未见过/注意到的非常酷的模式!
    • 但是为什么不定义一个取消订阅函数,实现监听的组件可以调用store.unsubscribe(listener)。是不是因为它把组件和 store 解耦了?
    • @sabman:由于我不是该库的创建者,所以我不能说为什么这个解决方案比另一个更受欢迎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2021-08-23
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多