RxJs subscribeTo.js 可观察检查在 Chrome 中有效,但在 Chrome Incognito、MS Edge 和 Firefox 中失败
RxJs subscribeTo.js observable check works in Chrome, but fails in Chrome Incognito, MS Edge, and Firefox
在我的 Anguar(7) 项目中,我使用了 redux-observable to do my 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.
在阅读了来自 这个 GitHub 线程 的回复后,我试图深入研究 subscribeTo.js。最后,用户 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隐身)
注意 Observable 是一个可观察对象。它甚至通过了 RxJs 自己的 isObservable 测试。那么为什么它没有通过下面的检查呢?
如果你仔细观察上面,你可以看到传入的 Observable 的 proto 看起来与左侧和右侧不同。更准确地说,左边有函数 属性 Symbol(observable): f ()
,而右边没有。相反,右边有@@observable: f ()
.
简而言之,检查 result && typeof result[Symbol_observable] === 'function'
是错误的原因,因为缺少 Symbol_observable。据我所知。
依赖项和版本
我用
- angular 7.0.2
- rxjs 6.3.3
- rxjs-compat 6.3.3
- redux-observable 1.0.0(他们使用 rxjs 6 - package.json))。
我的问题
为什么会这样?
我该如何解决?
我看过 symbol-observable,但我不确定如何使用它,或者这是否是一个好的解决方案。
我遇到了同样的问题,配置几乎相同。
经过一些研究,我检查了所有导入并更改了来自 (rxjs/internal/operators
)
的所有导入
import { catchError, flatMap, map, skipWhile } from 'rxjs/internal/operators';
至 (rxjs/operators
)
import { catchError, flatMap, map, skipWhile } from 'rxjs/operators';
这解决了 Firefox 的问题,Chrome 隐身,...
干杯
我遇到了与 rxjs/index
相同的问题。
更改自:
import { of, from, combineLatest, ... } from `rxjs/index`
至:
import { of, from, combineLatest, ... } from `rxjs`
已修复。
祝你好运:)
在我的 Anguar(7) 项目中,我使用了 redux-observable to do my 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.
在阅读了来自 这个 GitHub 线程 的回复后,我试图深入研究 subscribeTo.js。最后,用户 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隐身)
注意 Observable 是一个可观察对象。它甚至通过了 RxJs 自己的 isObservable 测试。那么为什么它没有通过下面的检查呢?
如果你仔细观察上面,你可以看到传入的 Observable 的 proto 看起来与左侧和右侧不同。更准确地说,左边有函数 属性 Symbol(observable): f ()
,而右边没有。相反,右边有@@observable: f ()
.
简而言之,检查 result && typeof result[Symbol_observable] === 'function'
是错误的原因,因为缺少 Symbol_observable。据我所知。
依赖项和版本
我用
- angular 7.0.2
- rxjs 6.3.3
- rxjs-compat 6.3.3
- redux-observable 1.0.0(他们使用 rxjs 6 - package.json))。
我的问题
为什么会这样? 我该如何解决?
我看过 symbol-observable,但我不确定如何使用它,或者这是否是一个好的解决方案。
我遇到了同样的问题,配置几乎相同。
经过一些研究,我检查了所有导入并更改了来自 (rxjs/internal/operators
)
import { catchError, flatMap, map, skipWhile } from 'rxjs/internal/operators';
至 (rxjs/operators
)
import { catchError, flatMap, map, skipWhile } from 'rxjs/operators';
这解决了 Firefox 的问题,Chrome 隐身,...
干杯
我遇到了与 rxjs/index
相同的问题。
更改自:
import { of, from, combineLatest, ... } from `rxjs/index`
至:
import { of, from, combineLatest, ... } from `rxjs`
已修复。
祝你好运:)