Dio网络请求框架之InterceptorResultTyp

InterceptorResultType

enum InterceptorResultType {
  next,
  resolve,
  resolveCallFollowing,
  reject,
  rejectCallFollowing,
}

这段代码定义了一个枚举类型 InterceptorResultType,它包含以下成员:

  • next: 表示拦截器处理结果为继续执行下一个拦截器。
  • resolve: 表示拦截器处理结果为解决(resolve)操作,通常用于处理成功的情况。
  • resolveCallFollowing: 表示拦截器处理结果为解决(resolve)操作,并要求继续执行后续的拦截器。
  • reject: 表示拦截器处理结果为拒绝(reject)操作,通常用于处理失败的情况。
  • rejectCallFollowing: 表示拦截器处理结果为拒绝(reject)操作,并要求继续执行后续的拦截器。

这个枚举类型用于表示拦截器的处理结果类型,拦截器可以根据具体的业务逻辑选择合适的结果类型并返回给调用方。枚举类型的成员提供了一种清晰的方式来表达拦截器的处理结果,使代码更易读和理解。

InterceptorState

class InterceptorState<T> {
  const InterceptorState(this.data, [this.type = InterceptorResultType.next]);

  final T data;
  final InterceptorResultType type;
}

这段代码定义了一个泛型类 InterceptorState<T>,表示拦截器的状态。它有两个成员变量:

  • data:表示拦截器的数据,类型为泛型参数 T,用于存储拦截器的处理结果或相关数据。
  • type:表示拦截器的状态类型,类型为 InterceptorResultType 枚举,用于指示拦截器的处理结果类型,默认为 InterceptorResultType.next

构造函数 InterceptorState 接收一个泛型参数 data 和一个可选的参数 type,用于创建 InterceptorState 的实例。可以根据具体的业务需求传入不同的数据和状态类型来创建相应的拦截器状态实例。

通过使用 InterceptorState 类,拦截器可以通过返回一个 InterceptorState 实例来表示其处理结果和状态。调用方可以根据拦截器返回的 InterceptorState 对象来判断拦截器的处理结果类型和获取相应的数据。这样可以更灵活地处理拦截器的状态和结果。

_BaseHandler(抽象类)

abstract class _BaseHandler {
  final _completer = Completer<InterceptorState>();
  void Function()? _processNextInQueue;

  Future<InterceptorState> get future => _completer.future;

  bool get isCompleted => _completer.isCompleted;
}

这段代码定义了一个抽象类 _BaseHandler,它包含以下成员:

  • _completer: 一个 Completer 对象,用于处理异步操作的完成和结果返回。它的泛型参数指定了它的返回类型为 InterceptorState
  • _processNextInQueue: 一个可选的无参函数,用于处理队列中的下一个操作。
  • future: 通过 _completerfuture 属性,可以获取一个 Future 对象,用于等待异步操作的完成并获取结果。
  • isCompleted: 通过 _completerisCompleted 属性,可以判断异步操作是否已完成。

该抽象类提供了一种基础的处理器机制,用于处理拦截器的异步操作。具体的拦截器处理器可以继承这个抽象类,并根据需要实现自己的逻辑。子类可以使用 _completer 来完成异步操作并返回结果,同时可以通过 _processNextInQueue 来处理队列中的下一个操作。

需要注意的是,这段代码中的 _BaseHandler 是一个抽象类,不能直接实例化。它需要在具体的拦截器处理器中进行实现和使用。

RequestInterceptorHandler

class RequestInterceptorHandler extends _BaseHandler {
  /// Continue to call the next request interceptor.
  void next(RequestOptions requestOptions) {
    _completer.complete(InterceptorState<RequestOptions>(requestOptions));
    _processNextInQueue?.call();
  }

  /// Return the response directly! Other request interceptor(s) will not be executed,
  /// but response and error interceptor(s) may be executed, which depends on whether
  /// the value of parameter [callFollowingResponseInterceptor] is true.
  ///
  /// [response]: Response object to return.
  /// [callFollowingResponseInterceptor]: Whether to call the response interceptor(s).
  void resolve(
    Response response, [
    bool callFollowingResponseInterceptor = false,
  ]) {
    _completer.complete(
      InterceptorState<Response>(
        response,
        callFollowingResponseInterceptor
            ? InterceptorResultType.resolveCallFollowing
            : InterceptorResultType.resolve,
      ),
    );
    _processNextInQueue?.call();
  }

  /// Complete the request with an error! Other request/response interceptor(s) will not
  /// be executed, but error interceptor(s) may be executed, which depends on whether the
  /// value of parameter [callFollowingErrorInterceptor] is true.
  ///
  /// [error]: Error info to reject.
  /// [callFollowingErrorInterceptor]: Whether to call the error interceptor(s).
  void reject(DioError error, [bool callFollowingErrorInterceptor = false]) {
    _completer.completeError(
      InterceptorState<DioError>(
        error,
        callFollowingErrorInterceptor
            ? InterceptorResultType.rejectCallFollowing
            : InterceptorResultType.reject,
      ),
      error.stackTrace,
    );
    _processNextInQueue?.call();
  }
}

这段代码定义了 RequestInterceptorHandler 类,该类继承自 _BaseHandlerRequestInterceptorHandler 类用于处理请求拦截器的操作,并提供了几个方法来控制请求的处理流程。

  1. next(RequestOptions requestOptions) 方法用于继续调用下一个请求拦截器。它接收一个 RequestOptions 参数,表示请求的选项。调用该方法会将 requestOptions 封装成 InterceptorState<RequestOptions> 对象并完成 Completer,表示请求拦截器的处理结果为继续执行下一个拦截器。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  2. resolve(Response response, [bool callFollowingResponseInterceptor = false]) 方法用于直接返回响应结果,不再执行其他请求拦截器。它接收一个 Response 参数表示响应对象,以及一个可选的布尔值 callFollowingResponseInterceptor,表示是否继续调用后续的响应拦截器。调用该方法会将 response 封装成 InterceptorState<Response> 对象并完成 Completer,表示请求拦截器的处理结果为直接返回响应。如果 callFollowingResponseInterceptortrue,则状态类型为 InterceptorResultType.resolveCallFollowing,否则为 InterceptorResultType.resolve。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  3. reject(DioError error, [bool callFollowingErrorInterceptor = false]) 方法用于以错误方式完成请求,不再执行其他请求和响应拦截器。它接收一个 DioError 参数表示错误信息,以及一个可选的布尔值 callFollowingErrorInterceptor,表示是否继续调用后续的错误拦截器。调用该方法会将 error 封装成 InterceptorState<DioError> 对象并完成 Completer,表示请求拦截器的处理结果为以错误方式完成请求。如果 callFollowingErrorInterceptortrue,则状态类型为 InterceptorResultType.rejectCallFollowing,否则为 InterceptorResultType.reject。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。

通过调用这些方法,可以控制请求拦截器的处理流程,包括继续执行下一个拦截器、直接返回响应结果或以错误方式完成请求。这样可以灵活地处理请求拦截器的逻辑和流程。

ResponseInterceptorHandler

class ResponseInterceptorHandler extends _BaseHandler {
  /// Continue to call the next response interceptor.
  void next(Response response) {
    _completer.complete(
      InterceptorState<Response>(response),
    );
    _processNextInQueue?.call();
  }

  /// Return the response directly! Other response i02
  void resolve(Response response) {
    _completer.complete(
      InterceptorState<Response>(
        response,
        InterceptorResultType.resolve,
      ),
    );
    _processNextInQueue?.call();
  }

  /// Complete the request with an error! Other response interceptor(s) will not
  /// be executed, but error interceptor(s) may be executed, which depends on whether the
  /// value of parameter [callFollowingErrorInterceptor] is true.
  ///
  /// [error]: Error info to reject.
  /// [callFollowingErrorInterceptor]: Whether to call the error interceptor(s).
  void reject(DioError error, [bool callFollowingErrorInterceptor = false]) {
    _completer.completeError(
      InterceptorState<DioError>(
        error,
        callFollowingErrorInterceptor
            ? InterceptorResultType.rejectCallFollowing
            : InterceptorResultType.reject,
      ),
      error.stackTrace,
    );
    _processNextInQueue?.call();
  }
}

这段代码定义了 ResponseInterceptorHandler 类,该类同样继承自 _BaseHandlerResponseInterceptorHandler 类用于处理响应拦截器的操作,并提供了几个方法来控制响应的处理流程。

  1. next(Response response) 方法用于继续调用下一个响应拦截器。它接收一个 Response 参数,表示响应对象。调用该方法会将 response 封装成 InterceptorState<Response> 对象并完成 Completer,表示响应拦截器的处理结果为继续执行下一个拦截器。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  2. resolve(Response response) 方法用于直接返回响应结果,不再执行其他响应拦截器。它接收一个 Response 参数表示响应对象。调用该方法会将 response 封装成 InterceptorState<Response> 对象并完成 Completer,表示响应拦截器的处理结果为直接返回响应。状态类型为 InterceptorResultType.resolve。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  3. reject(DioError error, [bool callFollowingErrorInterceptor = false]) 方法用于以错误方式完成响应,不再执行其他响应拦截器。它接收一个 DioError 参数表示错误信息,以及一个可选的布尔值 callFollowingErrorInterceptor,表示是否继续调用后续的错误拦截器。调用该方法会将 error 封装成 InterceptorState<DioError> 对象并完成 Completer,表示响应拦截器的处理结果为以错误方式完成响应。如果 callFollowingErrorInterceptortrue,则状态类型为 InterceptorResultType.rejectCallFollowing,否则为 InterceptorResultType.reject。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。

通过调用这些方法,可以控制响应拦截器的处理流程,包括继续执行下一个拦截器、直接返回响应结果或以错误方式完成响应。这样可以灵活地处理响应拦截器的逻辑和流程。

ErrorInterceptorHandler

class ErrorInterceptorHandler extends _BaseHandler {
  /// Continue to call the next error interceptor.
  void next(DioError err) {
    _completer.completeError(
      InterceptorState<DioError>(err),
      err.stackTrace,
    );
    _processNextInQueue?.call();
  }

  /// Complete the request with Response object and other error interceptor(s) will not be executed.
  /// This will be considered a successful request!
  ///
  /// [response]: Response object to return.
  void resolve(Response response) {
    _completer.complete(
      InterceptorState<Response>(
        response,
        InterceptorResultType.resolve,
      ),
    );
    _processNextInQueue?.call();
  }

  /// Complete the request with a error directly! Other error interceptor(s) will not be executed.
  void reject(DioError error) {
    _completer.completeError(
      InterceptorState<DioError>(
        error,
        InterceptorResultType.reject,
      ),
      error.stackTrace,
    );
    _processNextInQueue?.call();
  }
}

这段代码定义了 ErrorInterceptorHandler 类,该类同样继承自 _BaseHandlerErrorInterceptorHandler 类用于处理错误拦截器的操作,并提供了几个方法来控制错误的处理流程。

  1. next(DioError err) 方法用于继续调用下一个错误拦截器。它接收一个 DioError 参数,表示错误信息。调用该方法会将 err 封装成 InterceptorState<DioError> 对象并以错误方式完成 Completer,表示错误拦截器的处理结果为继续执行下一个拦截器。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  2. resolve(Response response) 方法用于以响应对象的方式完成请求,且不再执行其他错误拦截器。它接收一个 Response 参数表示响应对象。调用该方法会将 response 封装成 InterceptorState<Response> 对象并完成 Completer,表示错误拦截器的处理结果为以响应对象的方式完成请求。状态类型为 InterceptorResultType.resolve。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。
  3. reject(DioError error) 方法用于直接以错误方式完成请求,且不再执行其他错误拦截器。它接收一个 DioError 参数表示错误信息。调用该方法会将 error 封装成 InterceptorState<DioError> 对象并以错误方式完成 Completer,表示错误拦截器的处理结果为以错误方式完成请求。状态类型为 InterceptorResultType.reject。同时,它会调用 _processNextInQueue 函数来触发执行下一个拦截器。

通过调用这些方法,可以控制错误拦截器的处理流程,包括继续执行下一个拦截器、以响应对象方式完成请求或以错误方式完成请求。这样可以灵活地处理错误拦截器的逻辑和流程。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 13:54
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
难怪不开摄像头,全是简单的性格题,比大疆友善多了
NULL10086:今早上发的测评,我这还没做呢,官网上已经显示挂了
投递大疆等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务