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

Mar*_*nJH 1 rxjs redux redux-observable angular

在我的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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,则会引发错误的终极版,可观察到的createEpicMiddleware,而这是由RxJs检查造成subscribeTo.js

在读取了此GitHub线程的响应后,我然后尝试深入研究subscribeTo.js。最后,用户Agraphie指出在subscriptionTo.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('---------------------------')
        });
    }
    ...
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

注意,可观察的IS是可观察的。它甚至通过了RxJs自己的isObservable测试。那么,为什么它没有通过下面的检查呢?

如果您在上方靠近看,您会发现传入的可观察对象的原型看起来与左侧和右侧不同。更准确地说,左侧具有function属性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,但是我不确定如何使用它,或者这是否是一个好的解决方案。

小智 7

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

经过研究后,我检查了所有进口,并从(rxjs/internal/operators)更改了所有进口

import { catchError, flatMap, map, skipWhile } from 'rxjs/internal/operators';
Run Code Online (Sandbox Code Playgroud)

至(rxjs/operators

import { catchError, flatMap, map, skipWhile } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

这解决了Firefox,Chrome Incognito等问题。

干杯