toStream(mobx)和subject,不像我期望的那样表现

时间:2018-06-18 10:33:44

标签: rxjs mobx

我有以下代码,其目的是听取'ui state'类的变化(有一堆可观察的字段)。

get ui_store$(): Subject<UIStore> {
    if (!this.uiStoreSubject) {
        this.uiStoreSubject = new Subject<UIStore>();

        let stream = toStream(() => {
            this.logger.info(`UI Store changed to ${this._ui_store}. Signed in: ${this._ui_store.signed_in}`);
            toJS(this._ui_store);
            return this._ui_store;
        });

        stream.subscribe(this.uiStoreSubject);
    }
    return this.uiStoreSubject;
}

我无法接收通知。作为测试,在我的页面上,我把:

    this.sub = this.store.ui_store$.subscribe(uis => {
        this.logger.error(`**** UI Changed to ${SafeJSON.stringify(uis)}`)
    }, err => {
        this.logger.error(`Error in UI State change: ${err}`)
    }, () => {
        this.logger.warn(`UI State change COMPLETED`);
    });

页面上有另一个按钮,用于在UI商店中设置属性,我确实看到来自toStream()的日志记录,因此我知道更改会导致toStream()发出更改。

  

22:24:04,486 service.store UI Store已更改为[object Object]。登录:true

但订阅该主题的页面从未看到任何内容。 如果我破解并放置:

                this.uiStoreSubject.next(this._ui_store);

在toStream()方法中,为了强制主体接收一个值,它可以工作......但是我认为这不应该是必要的,除了感觉不对。我去疯了吗?

据我所读,我想:

            stream.subscribe(this.uiStoreSubject);

应该a)监听流上的变化,并b)将它们吐回主题。据我所知,它只是在这个主题上称为“下一个”。

这是mobx的toStream():

function toStream(expression) {
var computedValue = mobx_1.computed(expression);
return _a = {
        subscribe: function (observer) {
            return {
                unsubscribe: computedValue.observe(typeof observer === "function"
                    ? function (_a) {
                        var newValue = _a.newValue;
                        return observer(newValue);
                    }
                    : function (_a) {
                        var newValue = _a.newValue;
                        return observer.next(newValue);
                    })
            };
        }
    },
    _a[observableSymbol()] = self,
    _a;
var _a;

我必须承认我并不完全清楚为什么它会返回一个有一个'取消订阅'对象成员的函数 - 我不明白......也许是内部代码,调用.next永远不会被执行?< / p>

请问我出错的任何提示或指示?

0 个答案:

没有答案