【问题标题】:How to use rxjs takeWhile operator with apollo-client watchQuery?如何将 rxjs takeWhile 运算符与 apollo-client watchQuery 一起使用?
【发布时间】:2020-07-02 11:14:37
【问题描述】:

我有一个 Svelte 应用程序,我使用 watchQuery 订阅查询。我想同时使用 rxjs 中的 takeWhile 运算符,但出现此错误:

TypeError: $client.watchQuery(...).takeWhile is not a function

有没有办法可以将takeWhileapollo-clientwatchQuery 订阅一起使用?

这是我的代码:

$client.watchQuery({
  query: SomeRandomQuery,
  variables: {},
})
.pipe(takeWhile(() => isAlive))
.subscribe(res => {
 ...
});

我也尝试删除 pipe() 并直接传递它,但得到了同样的错误。

$client.watchQuery({
  query: SomeRandomQuery,
  variables: {},
})
.takeWhile(() => isAlive)
.subscribe(res => {
 ...
});

谢谢

【问题讨论】:

    标签: rxjs apollo react-apollo apollo-client svelte


    【解决方案1】:

    尝试使用 takeUntil

    const finalise = new Subject();
    
    $client.watchQuery({
      query: SomeRandomQuery,
      variables: {},
    })
    .pipe(takeUntil(finalise))
    .subscribe(res => {
     ...
    });
    

    现在,当您想完成 observable 时,您可以调用 next 主题。

    finalise.next();
    finalise.complete();
    

    这是我们在 Angular 组件中使用的既定模式,其中单个主体可以在单个 onDestroy 方法中完成所有可观察链。

    这样做的好处是 finalize 是一个 observable 并且会在它发出时触发 takeUntil,take 和 takeWhile 不会将 observable 作为参数,并且会一直保持订阅状态,直到 observable 发出导致孤儿订阅。

    【讨论】:

    • 感谢您的回答。我熟悉上述模式,甚至尝试过,但问题是我不能像在 Angular 中那样使用 watchQuery 订阅链接 .pipe()takeUnittakeWhile。它仍然抛出相同的错误 - Uncaught (in promise) TypeError: $client.watchQuery(...).pipe is not a function 我正在从 apollo-boost$client const 中初始化 ApolloClient。我在 Svelte 3 应用程序中使用此设置。
    • 你使用的是什么版本的 RxJs?管道不是函数意味着 watchQuery 不返回可观察对象,或者您使用的是 RxJs 版本 5。我不熟悉 Svelte,所以不确定 $client.watchQuery 做了什么。
    • 我刚刚在 Google 上搜索了一下,watchQuery 返回了一个 ObservableQuery 对象,从我的快速阅读来看,它看起来不像是一个 RxJs Observable。
    • ObservableQuery 上的 valueChanges 属性是 Observable。
    • 很奇怪,valueChanges 属性是未定义的。如果我使用$client.watchQuery({... }).valueChanges.subscribe(res => {,则获取TypeError: Cannot read property 'subscribe' of undefined。对此有任何指示吗?
    猜你喜欢
    • 2017-12-22
    • 2021-01-11
    • 2018-09-05
    • 1970-01-01
    • 2020-03-31
    • 2018-07-04
    • 2019-12-29
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多