取消请求方法

本文探讨了如何使用RxJS的switchMap处理请求竞态问题,并提出了解决在请求期间修改数据源导致页面显示错误的方法。通过引入锁机制避免在请求时切换Tab,同时展示了如何利用axios的CancelToken实现请求取消,确保资源的有效管理。
摘要由CSDN通过智能技术生成

取消请求方法

rxjs的switchMap

// 然而rxjs只能解决请求竞态的问题,如果在请求期间修改了listdata数据源(如下所示读取了缓存),那么页面结果展示依然是错误的
// 最好的方法是对页面操作施加锁,一旦在请求,不能切tab

getList$ = new Subject();

@Watch('filters', { deep: true, immediate: true })
async resetFilters(filter: any) {
  const { startDate, endDate } = filter;
  // 有缓存读缓存
  if (this.timeMap[`${startDate}${endDate}`]) {
    this.listData = this.timeMap[`${startDate}${endDate}`].list;
    this.finish = this.timeMap[`${startDate}${endDate}`].finish;
    this.page = this.timeMap[`${startDate}${endDate}`].page;
    return;
  }
  if (!this.activatedFlag || startDate === endDate) return;
  // 从头开始获取列表
  this.finish = false;
  this.page = 0;
  this.listData = [];
  this.loadMore();
}

public loadMoreInit() {
  this.getList$
    .pipe(
      switchMap(() => {
        return this.getList();
      })
    )
    .subscribe(
      ({ items: newData, paginator: { page, pageSize, totalCount } }) => {
        const { startDate, endDate } = this.filters;
        this.loading = false;
        if (page * pageSize >= totalCount) {
          this.finish = true;
        }
        this.listData = this.listData.concat(newData) as [];
        this.timeMap[`${startDate}${endDate}`] = {
          page: this.page,
          finish: this.finish,
          list: this.listData,
        };
      }
    );
}

public getList() {
  return this.getListData({
    page: this.page,
    pageSize: 10,
    ...this.filters,
  });
}

public async loadMore() {
  if (this.finish) {
    return;
  }
  this.page += 1;
  this.loading = true;
  this.getList$.next({});
}

cancelToken

import axios from 'axios';

const { CancelToken } = axios;

data() {
  return {
    cancelRequest: null, // 初始时没有请求需要取消,设为null
  };
},

getListData(filter) {
  if (typeof this.cancelRequest === 'function') {
    this.cancelRequest();
  }
  return api.getListNewMemberRankPaged(
    filter,
    // 第二个参数传到底层的axios的options中
    new CancelToken(function executor(c) {
      this.cancelRequest = c;
    })
  );
},
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值