【问题标题】:Observable don't seem to work with Chrome 41Observable 似乎不适用于 Chrome 41
【发布时间】:2019-05-01 05:32:21
【问题描述】:

我目前正在尝试让 Google 正确抓取我的 Angular 7 应用程序,但不幸的是,当我订阅它或尝试将其转换为 Promise 时,使用 HttpClient 似乎会产生一些麻烦。

使用HttpClient时,chrome 41抛出如下错误:

TypeError: Cannot read property 'call' of undefined {stack: (...), message: "Cannot read property 'call' of undefined"}
errors.ts:35defaultErrorLogger
error_handler.ts:51push../node_modules/@angular/core/fesm5/core.js.ErrorHandler.handleError
application_ref.ts:230next
event_emitter.ts:110push../node_modules/@angular/core/fesm5/core.js.EventEmitter.subscribe.schedulerFn
Subscriber.ts:266push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.__tryOrUnsub
Subscriber.ts:208push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.next
Subscriber.ts:140push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber._next
Subscriber.ts:100push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next
Subject.ts:71push../node_modules/rxjs/_esm5/internal/Subject.js.Subject.next
event_emitter.ts:92push../node_modules/@angular/core/fesm5/core.js.EventEmitter.emit
ng_zone.ts:296(anonymous function)
zone.js:391push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke
zone.js:150push../node_modules/zone.js/dist/zone.js.Zone.run
ng_zone.ts:218push../node_modules/@angular/core/fesm5/core.js.NgZone.runOutsideAngular
ng_zone.ts:296onHandleError
zone.js:395push../node_modules/zone.js/dist/zone.js.ZoneDelegate.handleError
zone.js:245push../node_modules/zone.js/dist/zone.js.Zone.scheduleTask
zone.js:261push../node_modules/zone.js/dist/zone.js.Zone.scheduleMacroTask
zone.js:1194scheduleMacroTaskWithCurrentZone
zone.js:3371(anonymous function)
zone.js:1518push../node_modules/zone.js/dist/zone.js.proto.(anonymous function)
xhr.ts:319push../node_modules/@angular/common/fesm5/http.js.HttpXhrBackend.handle
Observable.ts:239push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe
Observable.ts:221push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe
subscribeToResult.ts:29subscribeToResult
mergeMap.ts:156push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._innerSub
mergeMap.ts:149push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext
mergeMap.ts:132push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._next
Subscriber.ts:100push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber.next
subscribeToArray.ts:11push../node_modules/rxjs/_esm5/internal/util/subscribeToArray.js.subscribeToArray
Observable.ts:239push../node_modules/rxjs/_esm5/internal/Observable.js.Observable._trySubscribe
Observable.ts:221push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe
mergeMap.ts:111push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapOperator.call
Observable.ts:215push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe
filter.ts:72push../node_modules/rxjs/_esm5/internal/operators/filter.js.FilterOperator.call
Observable.ts:215push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe
map.ts:60push../node_modules/rxjs/_esm5/internal/operators/map.js.MapOperator.call
Observable.ts:215push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.subscribe
...
...
...

我通过替换这个做了一个简单的检查:

  this.http.get(endpoint, this.requestHeaders).toPromise()

通过这个:

  this.http.get(endpoint, this.requestHeaders)

错误消失了,但我无法在水龙头内解决我的承诺,所以它对我来说并不是很有用。知道出了什么问题吗?

【问题讨论】:

  • 您仍然需要订阅管道。否则 observable 将不会调用 http 调用。
  • 不幸的是同样的错误...之前的代码在最新的 chrome 版本中运行良好
  • 因为 Google 使用 Chrome 41 来抓取网站。
  • 您提供的代码看起来是正确的。在某处使用 mergeMap 或 map 会中断您的通话。
  • 我希望它这么简单,不幸的是,代码库没有在任何地方使用 mergeMap,所以在较低级别发生了一些事情......

标签: javascript angular rxjs google-crawlers


【解决方案1】:

我很确定您的订阅函数的参数不正确..

它应该接收如下函数。

return this.http.get(filename, {responseType: 'text'})
    .subscribe(
        data => { 
            this.log(filename, data);
        },
        error => { 
            this.logError(filename, error);
        });

更新:

请在caniuse.com 的浏览器版本中查看Promise 的兼容性。据此,Chrome 41 不支持 Promise 类,并且仅支持 Chrome 63。

另外一点是,Chrome 版本 4-41 也不支持 ES6 classes。

【讨论】:

  • 我用支持/兼容性链接的链接更新了我的答案。 Chrome 版本 4-41 似乎不支持 ES6 功能
猜你喜欢
  • 2020-01-12
  • 2021-06-24
  • 1970-01-01
  • 2020-04-04
  • 2023-04-06
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多