【问题标题】:Accessing its own object properties before function returns在函数返回之前访问它自己的对象属性
【发布时间】:2018-02-13 08:02:08
【问题描述】:

在下面的代码中,forEach 循环运行的匿名函数能够在buttonClicks.forEach(..) 将订阅对象返回给subscription 变量之前,在其第一次运行时调用subscription.dispose()

forEach 至少运行一次之前,forEach(..) 如何访问它返回的对象?

function(button) {
    var buttonClicks = Observable.fromEvent(button, "click");

    // In the case of an Observable, forEach returns a subscription object.
    var subscription =
        buttonClicks.
            forEach(function(clickEvent) {
                alert("Button was clicked. Stopping Traversal.");

                // Stop traversing the button clicks
                subscription.dispose();
            });
}

【问题讨论】:

    标签: javascript reactivex


    【解决方案1】:

    变量subscription 已声明。

    forEach返回后初始化,之前为undefined

    所以点击处理程序可以引用变量。它不能做的是实际上调用dispose,因为它需要该变量来保存一个值(但这在有人点击之前不会发生,到那时forEach 早就返回并分配了变量)。

    请注意,Observable#forEach 不会立即运行您传递给它的函数(与 Array#forEach 不同)。每次可观察对象发出一个值时都会运行该函数(这里:发生了一次点击)。

    还请注意,您可以稍后将subscription 分配给其他东西,它会调用dispose。它与forEach 返回的对象并没有真正的联系。点击处理程序将继续引用变量,而不是变量创建时的

    【讨论】:

    • 嗯,谢谢。所以你的意思是,当JS引擎第一次解析代码时,buttonClicks集合是空的。因此subscription 是立即定义的?但是,正如您所说,它是在 forEach() 返回后初始化的。它试图在它自己内部调用它,在它完成返回之前。我在这里想念什么?再次感谢
    • buttonClicks 不是一个集合。它是一个可观察的。它不包含任何东西。它发出事件(forEach 可以使用)。
    • forEach 创建一个“订阅”。只要该订阅处于活动状态,每次可观察对象发出此事件时,您的处理程序函数都会继续被调用。从forEach(立即)返回的subscription 对象为您提供了取消此过程的方法。
    • 我知道。我只是称它为集合,因为实际上它类似于 Array,除了它是异步的,可以完成(与 Event 不同),并且可以用 forEach() 遍历。令人困惑的部分是处理程序如何在 forEach 完成其第一个周期之前对订阅对象运行 dispose()。
    • 再次:forEach 立即返回(subscription)。它现在运行您的事件处理程序。每次发出的事件(每次点击)都会运行一次,直到您取消订阅。
    猜你喜欢
    • 2011-03-07
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多