RxJs subscribeTo.js可观察检查在Chrome中有效,但在Chrome Incognito,MS Edge和Firefox中失败

问题描述 投票:1回答:1

在我的Anguar(7)项目中,我使用redux-observable来做我的redux副作用。

我的代码适用于Chrome,但在Chrome Incognito,MS Edge和Firefox中完全相同的版本都失败了。我得到的错误如下:

ERROR TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:58)
    at from (from.js:17)
    at MergeMapSubscriber.project (createEpicMiddleware.js:36)
    at MergeMapSubscriber.push.../../../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:61)
    at MergeMapSubscriber.push.../../../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:51)
    at MergeMapSubscriber.push.../../../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at MapSubscriber.push.../../../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:41)
    at MapSubscriber.push.../../../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next (Subscriber.js:54)
    at Subject.push.../../../node_modules/rxjs/_esm5/internal/Subject.js.Subject.next (Subject.js:47)
    at Function.epicMiddleware.run (createEpicMiddleware.js:62)
    at SafeSubscriber._next (redux.configuration.ts:50)

正如您所看到的,错误是在redux-observable的createEpicMiddleware中引发的,这是由RxJs subscribeTo.js中的检查引起的。

在阅读了subscribeTo.js的回复后,我试图深入了解this GitHub thread。最后,用户Agraphie评论了subscribeTo.js中的签入失败。我检查了这一点,果然,该检查适用于标准Chrome,但在所有其他浏览器中都失败了。我添加到subscribeTo.js的检查代码如下所示:

export var subscribeTo = function (result) {
    if (isObservable(result)) {
        result.pipe(filter(x => x && x.type === 'GET_PLATFORM_SUCCESS')).subscribe(x => {
            console.log('Incoming value', result);
            console.log(`result && typeof result[Symbol_observable] === 'function': \n`, result && typeof result[Symbol_observable] === 'function');
            console.log('---------------------------')
        });
    }
    ...

结果可以在下面的屏幕截图中看到(左侧是标准Chrome,右侧是Chrome Incognito)

enter image description here

注意Observable是一个可观察的。它甚至通过了RxJs自己的isObservable测试。那么为什么它在下面的检查中失败呢?

如果你仔细观察上方,你可以看到传入的observable的proto看起来与左侧和右侧不同。更确切地说,左侧具有功能属性Symbol(observable): f (),而右侧没有。相反,右侧有@@observable: f ()

简而言之,检查result && typeof result[Symbol_observable] === 'function'是错误的原因,因为缺少Symbol_observable。据我所知。

依赖关系和版本

我用

  • 角度7.0.2
  • rxjs 6.3.3
  • rxjs-compat 6.3.3
  • redux-observable 1.0.0(他们使用rxjs 6 - package.json))。

我的问题

为什么会这样?我该如何解决?

我看过symbol-observable,但我不确定如何使用它,或者这是否是一个很好的解决方案。

angular redux rxjs redux-observable
1个回答
6
投票

我有同样的问题,几乎相同的配置。

经过一些研究,我检查了所有进口并改变了所有进口(rxjs/internal/operators

import { catchError, flatMap, map, skipWhile } from 'rxjs/internal/operators';

到(rxjs/operators

import { catchError, flatMap, map, skipWhile } from 'rxjs/operators';

这解决了Firefox,Chrome Incognito,...的问题。

干杯


2
投票

我和rxjs/index有同样的问题。

改变:

import { of, from, combineLatest, ... } from `rxjs/index`

至:

import { of, from, combineLatest, ... } from `rxjs`

固定它。

祝好运 :)

© www.soinside.com 2019 - 2024. All rights reserved.