首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在react-query中使用可观察对象

在react-query中使用可观察对象
EN

Stack Overflow用户
提问于 2021-07-06 21:44:41
回答 1查看 418关注 0票数 0

我正在构建一个应用程序,并计划将rxjs用于可观察对象。然而,我喜欢react-query缓存功能,并希望将它们合并在一起以使其正常工作。

我正面临一个错误代码对我来说不清楚的问题。

敬请指教。

代码语言:javascript
复制
import React, { FunctionComponent } from 'react';
import { render } from 'react-dom';
import { useQueryStream } from './useQueryStream';
import API from './apiService';
import './style.css';
import { Observable, of } from 'rxjs';
import { catchError, take } from 'rxjs/operators';

const Hello: FunctionComponent = () => {
  const fetchPokemon = <T>(): Observable<T[]> => {
    const data =  API.get<T[]>('pokemon?limit=100&offset=0').pipe(
      take(1),
      catchError(err => of(console.log(err)))
    ) as Observable<T[]>;

    console.log(data)
  };

  const result = useQueryStream('data', fetchPokemon);
  return <>{JSON.stringify(result, null, 2)}</>;
};

export default Hello;

我还扩展了react-query以接受一个可观察对象,并订阅它并发送数据。

代码语言:javascript
复制
import { QueryFunction, useQuery, useQueryClient } from 'react-query';
import { Observable, combineLatest } from 'rxjs';
import { useEffect } from 'react';
import { UseQueryOptions } from 'react-query/types/react/types';

export const useQueryStream = (
  queryKey: string,
  fetcher: QueryFunction,
  config?: UseQueryOptions
) => {
  const queryClient = useQueryClient();
  const queryResult = useQuery(queryKey, fetcher, config);

  useEffect(() => {
    if (queryResult.data instanceof Observable) {
      queryResult.data.subscribe({
        next: data => {
          queryClient.setQueryData(queryKey, (currentQueryData: any) => {
            currentQueryData && combineLatest(currentQueryData, data);
          });
        },
        error: error => {
          console.error(error);
        }
      });
    }
  }, [queryKey, queryResult.data]);

  console.log('queryResult', queryResult);

  return queryResult;
};

这是我的stackblitz链接:https://stackblitz.com/edit/react-ts-3tqgbx?file=Hello.tsx

请建议我如何修复错误以及如何恢复数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-06 21:58:11

由于这是一个.tsx文件,因此您不能像以前那样使用通用<T>,因为它将被解释为开始构件/元素标记:

您可以改用常规函数语法:

代码语言:javascript
复制
function fetchPokemon<T>(): Observable<T[]> {
  ...
}

但是,如果您确实想使用箭头函数,则可以使用:

代码语言:javascript
复制
const fetchPokemon = <T,>(): Observable<T[]> => {
  ...
}

...or:

代码语言:javascript
复制
const fetchPokemon = <T extends {}>(): Observable<T[]> => {
  ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68271722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档