reactjs - 带有 rxjs 错误的相关请求:可观察 {_isScalar: false, _subscribe: f}
问题描述
我是 Rxjs 的新手(^6.5.3)。我正在使用它为我的反应应用程序从 api 获取数据。我正在提出两个请求,一个依赖于另一个。我不知道我做错了什么,但我得到了这个错误:
// console ouput
Observable {_isScalar: false, _subscribe: f}
Observable {_isScalar: false, _subscribe: f}
.....
如何显示结果的示例:
// users endpoint
{
"data": {
"total": 130,
"users": [ // this format is also used as the User interface for typescript type check
{"id": 1, "name": "John Doe", "profile_url": "https://myapi.co/user/id/1"},
{"id": 2, "name": "Johny Doe", "profile_url": "https://myapi.co/user/id/2"}, ...
]
}
}
// user details endpoint
{
"data": {
"info":{"name": "John Doe", "age": 50, "gender": "male", "status": "active", ...}
}
}
这是我处理从 api 获取数据的代码
// User class
class User{
.....
private function getAllUsers(): Observable<User[]> {
return from(fetch(api.getUsers()).then(res => res.json()).then(res => res.data.users))
}
private function getUserDetails(url: string): Observable<User> {
return from(fetch(api.getUserDetails(url)).then(res => res.json()).then(res => res.data.info))
}
public function getUsers(): Observable<User[]> {
return this.getAllUsers()
.map(users => users.map(user => user.profile_url))
.flatMap(profiles => {
// console.log('flatmap: ', profiles.map(profiles => this.getUserDetails(profile)))
return r.map(x =>
this.getUserDetails(profile)
);
})
.map(users => users);
}
}
// index page
import ...
....
const userClass = new User();
userClass.getUsers()
.subscribe(users => {
console.log('users: ', users);
})
我发现了一个类似的问题Observable 依赖于另一个 observable
更新 1:将返回的 Observable 类型替换为 Observable<User>
orObservable<User[]>
解决方案
我认为这里有几个问题。我建议将类型替换为Observable<any>
observable 实际返回的类型,这将真正帮助您发现错误。将可观察对象链接在一起时,它对我有很大帮助。take(1)
当他们没有完成时也是我的朋友(但我只需要第一个结果)。
话虽如此,这篇文章对映射有一些很好的讨论。
flatMap/mergeMap - 立即为任何源项创建一个 Observable,所有以前的 Observable 都保持活动状态
concatMap - 在创建下一个 Observable 之前等待前一个 Observable 完成
switchMap - 对于任何源项,完成前一个 Observable 并立即创建下一个
excludeMap - 源项目在前一个 Observable 未完成时被忽略
getAllUsers
您想在启动内部可观察对象之前等待外部可观察对象 - - 完成getUserDetails
- 对吧?您可能正在寻找 concatMap 或 switchMap 而不是 flatmap。
推荐阅读
- java - 使用 JSch 将它们从网络复制到本地路径时文件大小为零
- database - 为什么 Sqflite 在 Android 上很慢?
- python - 如何根据另一列设置熊猫数据框背景颜色
- javascript - 如何将水印文本添加到图像上并在 html 电子邮件中相应显示?
- python - 如何使用opencv检测图像中的矩形(白板)?
- python - Python 请求 try/except continue/break 循环
- javascript - 跟踪 React v16 渲染警告
- ios - 在 Swift 5 中将字符串转换为日期
- javascript - 如何在 Javascript 中设置用户定义的时间并添加 2 小时?
- .net-core - .Net Core ILogger 将严重保存为错误