如何在 onError 回调中使用异步错误处理程序?

Posted

技术标签:

【中文标题】如何在 onError 回调中使用异步错误处理程序?【英文标题】:how to use asynchronous error handlers in onError callback? 【发布时间】:2021-08-05 18:42:11 【问题描述】:

我正在创建一个链接以删除来自服务器的401 响应上的用户身份验证令牌。这里的问题是,在我的案例AsyncStorage 中,我需要从存储中删除tokesn,顾名思义,它执行异步操作,但是如果我尝试将异步函数从onError 回调从@apollo/client/link/error 传递给onError,代码编辑器立即抛出以下错误:Type 'Promise<void>' is not assignable to type 'void | Observable<FetchResult< [key: string]: any; ,

那么有办法将异步回调传递给 onError 吗?

使令牌链接失效

import ErrorResponse, onError from '@apollo/client/link/error';

import isJwtError, JWTError from './errors';
// async function to remove auth token from asyncstorage
import removeTokens from './utils';

interface ResponseError extends ErrorResponse 
  networkError?: Error & 
    statusCode?: number;
    bodyText?: string;
  ;


export const invalidateTokenLink = onError((error: ResponseError) => 
  if (
    (error.networkError && error.networkError.statusCode === 401) ||
    error.graphQLErrors?.some(isJwtError)
  ) 
    if (error.graphQLErrors[0].extensions.code !== JWTError.expired) 
      // this is where I run an asynchronous function to remove the token
      removeTokens();
    
  
);

【问题讨论】:

【参考方案1】:

错误消息提到您可以返回Observable<FetchResult< [key: string]: any; 。似乎 apollo-client 使用了zen-observable 库。

你可以根据你的承诺构建一个 observable。或者使用observable-helpers 中的promiseToObservable 函数。

【讨论】:

你能分享一个实际的例子来澄清一下

以上是关于如何在 onError 回调中使用异步错误处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 apollo-link-error 获取 onError 回调中的 uri?

websockets中的onError回调

如何防止我的 Apollo 客户端错误处理程序(onError,错误链接)因同一错误被调用两次?

如何将每个回调包装在一个地方以改进错误处理

使用异步回调处理事件

如何将令牌设置为 onError ApolloClient?