在我的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)
注意Observable是一个可观察的。它甚至通过了RxJs自己的isObservable测试。那么为什么它在下面的检查中失败呢?
如果你仔细观察上方,你可以看到传入的observable的proto看起来与左侧和右侧不同。更确切地说,左侧具有功能属性Symbol(observable): f ()
,而右侧没有。相反,右侧有@@observable: f ()
。
简而言之,检查result && typeof result[Symbol_observable] === 'function'
是错误的原因,因为缺少Symbol_observable。据我所知。
我用
为什么会这样?我该如何解决?
我看过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 Incognito,...的问题。
干杯
我和rxjs/index
有同样的问题。
改变:
import { of, from, combineLatest, ... } from `rxjs/index`
至:
import { of, from, combineLatest, ... } from `rxjs`
固定它。
祝好运 :)