带有 rxjs 错误的相关请求:可观察 _isScalar: false, _subscribe: f

Posted

技术标签:

【中文标题】带有 rxjs 错误的相关请求:可观察 _isScalar: false, _subscribe: f【英文标题】:Dependent requests with rxjs error: Observable _isScalar: false, _subscribe: f带有 rxjs 错误的相关请求:可观察 _isScalar: false, _subscribe: f 【发布时间】:2020-03-25 22:08:12 【问题描述】:

我是 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 dependent on another observable

更新1:将返回的Observable类型替换为Observable&lt;User&gt;Observable&lt;User[]&gt;

【问题讨论】:

【参考方案1】:

我认为这里有一些问题。我建议将 Observable&lt;any&gt; 的类型替换为 observable 实际返回的类型,这将真正帮助您发现错误。将可观察对象链接在一起时,它对我有很大帮助。 take(1) 也是我的朋友,当时他们没有完成(但我只需要第一个结果)。

话虽如此,this post 对映射进行了一些很好的讨论。

flatMap/mergeMap - 立即为任何源项创建一个 Observable,所有以前的 Observable 都保持活动状态

concatMap - 等待前一个 Observable 完成后再创建下一个

switchMap - 对于任何源项,完成前一个 Observable 并立即创建下一个

exhaustMap - 源项目在前一个 Observable 未完成时被忽略

您想等待外部 observable - getAllUsers - 完成后再启动内部 observable - getUserDetails - 对吧?您可能正在寻找 concatMap 或 switchMap 而不是 flatmap。

【讨论】:

所以我在代码和帖子中都更改了返回的 observable 的类型。接下来我得到的是这个类型检查错误:Type 'Observable&lt;Observable&lt;User&gt;&gt;' is not assignable to type 'Observable&lt;User[]&gt;'. Type 'Observable&lt;User&gt;' is missing the following properties from type 'User[]': length, pop, push, join, and 18 more.ts(2322)。当我注释掉内部 observable 时,错误消失了。 我找到了适合我的解决方案:flatten nested observables。但是这个解决方案在打印结果之前等待所有可观察对象完成(需要时间,500 多个结果大约需要 5 分钟)。

以上是关于带有 rxjs 错误的相关请求:可观察 _isScalar: false, _subscribe: f的主要内容,如果未能解决你的问题,请参考以下文章

在注册之前验证可观察的响应以执行多个请求(iff)-RxJs

Rxjs 可观察等待,直到满足某些条件

如何在可观察的地图中抛出错误(rxjs 6,ng6)

RxJS - 连接并合并两个可观察对象

在对对象进行操作时链接递归 RxJS 可观察对象

缺少可观察的方法 RxJS 5.0.0-beta.0