当前位置: 首页 > 知识库问答 >
问题:

前端 - 搜索页面 input框onChange的时候调接口模糊搜索 请求相应速度不同引起了渲染数据是后返回数据的请求结果 有什么好的解决方案吗?

毕宏盛
2023-08-22

例如:第一次输入'如何',后端返回给我标题带有'如何'的文章数据,页面渲染'如何'相关文章
继续输入'准备',后端返回给我标题带有'如何准备'的文章数据,页面渲染'如何准备'相关文章
引发了一个问题 因为后端接口查'如何准备'返回的数据更快 导致页面先渲染'如何准备'相关文章然后又快速渲染'如何'相关文章 几乎看不到'如何准备'相关文章 感觉就像是搜索'如何准备'
页面渲染的是'如何'相关文章 请问这种问题 有什么好的解决方案吗?

共有3个答案

闾丘选
2023-08-22

可以考虑给页面加一个loading效果,只有当loading结束的时候才去请求下一个

薛浩言
2023-08-22

常规的办法是做一下防抖(Debounce)你可以设置一个300毫秒的防抖时间,这样在用户连续输入时候,用户输入完之后300毫秒后才会发送请求。

吕天逸
2023-08-22

防抖是防抖,但防抖不是为了解决这个时序问题的,它只是为了避免“输一个字符就发起一个请求”这种问题的。


正确的做法是全局存储一个 key,请求前生成一个唯一值、并利用闭包的特性获取其一份副本,然后请求结束后时比较副本和全局存储的 key,如果不相等,说明后面又有新的请求了,那就丢掉本次响应。

伪代码:

let loadingKey = 0;const request = () => {  loadingKey++;  const currentKey = loadingKey;  return axios.request({ /* 请求参数略 */ })    .then((res) => {      if (currentKey !== loadingKey) {        return; // 丢弃响应      }      console.log(res); // todo    });}Promise.all([  request(),  request(),  request() // 只有最后发出的请求的响应会被保留,前面的即使响应时序是后回来的,也会被丢弃]);

大名鼎鼎的 ahooks 库的 useRequest 就是这样实现的,当然它那个里面还有很多别的功能,所以代码看起来很复杂,但抽丝剥茧背后的原理是一样的。它是全局持有了一个 count 对象,每次 runAsync 之前 +1 然后持有了一个副本 currentCount。跟这里的 loadingKeycurrentKey 是一回事儿。


当然你也可以配合 axios 的 CancelToken 来实现,但这个方案跟 axios 就耦合过深了,以后换库就不太好办。

 类似资料:
  • 上述代码在开发阶段,pc 和 移动端模拟器中访问,数据请求正常且渲染成功; 部署服务器后,移动端真机没有发起请求,其他访问方式正常。 有无大佬遇到过或知道怎么解决? 目标站点(未备案) http://114.132.79.6/

  • 问题内容: 我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。 日志: 16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。 16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG? 16:19:23.976 [EventThread COM55]调试S

  • 上节介绍的,都是针对单条数据的操作。在 ES 环境中,更多的是搜索和聚合请求。在 5.0 之前版本中,数据获取和数据搜索甚至有极大的区别:刚写入的数据,可以通过 translog 立刻获取;但是却要等到 refresh 成为一个 segment 后,才能被搜索到。从 5.0 版本开始,Elasticsearch 稍作了改动,不再维护 doc-id 到 translog offset 的映射关系,一

  • vue2前端 代码如下 报错 created里的get请求可以获取到数据,为什么不渲染,报错搜索没有想要的结果,求求各位大佬帮忙看一下

  • 本文向大家介绍jQuery中ajax请求后台返回json数据并渲染HTML的方法,包括了jQuery中ajax请求后台返回json数据并渲染HTML的方法的使用技巧和注意事项,需要的朋友参考一下 html实例 jquery实例 php实例 以上这篇jQuery中ajax请求后台返回json数据并渲染HTML的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 请求的接口信息: 没有返回东西: 控制台报错: 前端代码: import axios from 'axios' import { baseURL, taskURL } from './resource' // 3.ES6 Promise 封装方式 export function request(options) { } 求大家帮个忙看看到底是哪里问题,要怎么修改,谢谢