【发布时间】:2018-08-22 11:20:23
【问题描述】:
在进行 http get 调用时,我正在使用 angular project source.lift is not a function 的自定义版本。错误在core.js 文件中。
如何解决这个问题?
【问题讨论】:
在进行 http get 调用时,我正在使用 angular project source.lift is not a function 的自定义版本。错误在core.js 文件中。
如何解决这个问题?
【问题讨论】:
我们也遇到了同样的问题。最后证明是括号不匹配的问题。我们使用了 switchMap 运算符和 catcherror 运算符。但是因为我们把括号弄错了。有趣的是,catcherror 运算符被用作 switchMap(结果选择器)的第二个参数,但仍然编译。所以请仔细检查你的括号。
【讨论】:
.map(map(mappingFunction)) 而不是 .map(mappingFunction) 触发了这个错误
subscribe(tap((): void => { ... })) 而不是(正确版本):subscribe((): void => { ... }) 即tap 在subscribe 部分内:-$
遇到同样的问题。 catchError 不应出现在抽头括号中。
错误:点击时调用了 catchError
getHeroes() : Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl)
.pipe(tap(_ => console.log('Fetching heroes'),
catchError(this.handleError('getting heroes', [])) ))
}
正确的是:(catchError not in tap)
getHeroes() : Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl)
.pipe(tap(_ => console.log('Fetching heroes')),
catchError(this.handleError('getting heroes', []) ))
}
【讨论】:
我在我的网络应用程序中遇到了同样的错误,直到我意识到要测试升级 rxjs 版本时才修复它,因为我在 6.0.0 有它,此时将其更改为最后一个版本 6.3 .2 解决了我的问题。 总之,这是 rxjs 第一版的一个错误,我们应该多测试一下,但到目前为止还不错。 希望对您有所帮助。
【讨论】:
尝试检查您的 webAPI。
如果您无权访问 Web 服务器的日志,您可以设置 null 而不是 'catchError' 块并使用调试器检查您的 Angular 应用程序。
【讨论】:
我遇到了同样的问题,并通过使用 catch 以及不在内部的管道作为 catchError 的参数来解决
this.http.post(payload)
.pipe(map((res) => {
return res.data;
}),
)
.catch(err => {
throw of(err);
});
}
【讨论】:
我曾多次遇到此错误,在进行单元测试时更是如此,但在工作代码或测试代码中可以重新创建问题。但我意识到只有当我将 catchError() 管道放置在其他转换管道(如 map() 之后)时。我将 catchError() 移到管道的顶部,它又可以正常工作了。
不正确:
obs.pipe(
map((data: Data) => {
// TODO: transform your data
}),
tap((registrationResponse) => {
// TODO: transform your data
}),
catchError((error) => {
// TODO: Throw an error
throw new Error('Throw a different error');
// OR
// TODO: Catch error and return a different observable value
return of(false)
})
);
正确:
obs.pipe(
catchError((error) => {
// TODO: Throw an error
throw new Error('Throw a different error');
// OR
// TODO: Catch error and return a different observable value
return of(false)
}),
map((data: Data) => {
// TODO: transform your data
}),
tap((registrationResponse) => {
// TODO: transform your data
})
);
虽然上述方法有效 - 我认为这是设计使然,尽管我还没有遇到任何有关它的官方文档。我相信这种行为是因为您在“catchError”中捕获的错误来自 Observable,而不是您的实现/转换。因此,在 map() si 等任何转换管道之前需要 catchError() 是有意义的
【讨论】:
对我来说,我使用 catchError 没有 tap
错误:
import {catchError} from 'rxjs/operators';
this.http.get(url, options).pipe(
catchError(
(err: HttpErrorResponse) => {
// Do Stuff
}
)
);
正确:
import {catchError, tap} from 'rxjs/operators';
this.http.get(url, options).pipe(
tap(
() => {},
catchError(
(err: HttpErrorResponse) => {
// Do Stuff
}
)
)
);
【讨论】:
对于所有在 Angular 中使用窗口时遇到此问题的人 - 我错误地从 rxjs 导入了窗口,这引发了此错误。
【讨论】: