美文网首页
前端针对多次异步请求结果的处理

前端针对多次异步请求结果的处理

作者: RichardBillion | 来源:发表于2018-11-26 00:19 被阅读35次

前言

在前端领域,你应该有见过这两种场景:

  1. 在搜索框中输入文本时,不断出现相关的提示词(联想词)
  2. 通过轮询向服务端请求数据(尽管跟服务器之间通信的技术层出不穷,但不可否认轮询的使用还是非常广泛)

那么问题来了:

针对场景1, 监听keyup事件, 得到当前输入框内的内容,(不考虑之前搜索结果的缓存),在输入过程中,如何保证异步请求返回的数据是与我当前输入内容相对应的结果?

针对场景2, 异步请求返回的结果哪些是能够为我所用的呢?跟场景1 的处理方式会是相同的么?

对大量异步请求结果的处理

如上的2种场景或者其他需要频繁进行网络请求的场景,如果网络请求的速度总是能跟上交互,那么这一切的问题都将不复存在,“天下武功,唯快不破”。但再快的请求终究是异步的,谁也无法保证请求结果返回的顺序。具体的处理思路,还是要跟场景结合,本文主要围绕以上的两个场景来讨论。

搜索场景对异步请求结果的处理

由于不同长度的文本语义相差比较大,搜索推荐需要保证比较高的匹配度。所以对返回的请求只能显示与当前输入框内内容相匹配的结果。

最简单的方式就是在制定接口时,让后端将前端的查询词querytext和其结果result一同返回,前端通过判断当前输入框的内容是否等于queryText,即可决定是否对result进行后续处理。

但倘若后端因为某种客观因素不便修改,前端又该怎么做呢?我们的目的其实无非是在一个异步请求返回时也想知道发送该请求时的query,以及当前输入框内的内容嘛。一个闭包搞定:

function query(text) {
    fetch('/api').then(res => res.json())
    .then(({result}) => {
        let content = getCurrentContent();
        if (content === text) {
            //对result进一步处理
        }
    })
}

轮询场景对异步请求结果的处理

在轮询场景,大都是用来获取最新数据的,所以针对异步网络请求,只要是更晚时间发出的请求其返回结果就可用。所以通常我们会使用一个字段来记录上次更新的时间(或者随请求发送事件次数递增的数字)。

// 全局变量记录上次更新时间
let lastUpdateTime = 0;

query(text, timeStamp) {
    fetch(`/api?query=${text}`).then(res => res.json())
    .then(({result}) => {
        if (timeStamp < lastUpdateTime) {
            return
        }
        lastUpdateTime = timeStamp
        //对result进行处理
    })
}

query(text, +Date.now())

总结

也不知道说点啥了,干脆提前祝大家元旦快乐吧~

相关文章

  • 前端针对多次异步请求结果的处理

    前言 在前端领域,你应该有见过这两种场景: 在搜索框中输入文本时,不断出现相关的提示词(联想词) 通过轮询向服务端...

  • 前端处理异步请求顺序

    之前有一道面试题 一个模糊搜索组件如何设计 首先防抖截流什么的肯定是能想到了 主要是一个问题 promise有一个...

  • forEach使用async,await并不能解决出现的异步问题

    需要针对数组的每一项发起一个http请求,并且每个请求都需要等待异步返回结果后依次处理,于是我选择了forEach...

  • Django中使用celery框架

    一. 目的 批量做接口请求时,运行时长超过1min,前端不可能一直等待结果,因此考虑异步处理的方式 二. 处理方式...

  • js里面实现异步调用的方式

    背景 前端页面中经常会遇到需要发起异步请求后,要等到异步请求返回结果才能执行某个操作的需求,如果不了解promis...

  • SpringBoot中使用异步处理

    1. 同步处理 创建Controller: 创建Service: 后台打印结果: 前端结果: 2. 使用异步 2....

  • 一个页面请求多个接口的设计方案

    在一个页面可能会有请求多个接口的情况,而接口的请求是异步的,为了能保证一个页面数据的同步处理,针对多个异步线程的处...

  • IntentService和HandlerThread

    IntentService 概述 处理异步请求的Service 客户端使用startService()发送异步请求...

  • 异步

    异步 异步请求 同步请求:同一个请求由一个线程从头到尾进行处理 一步到位 异步请求:同一个请求中由多个线程进行处理...

  • 多线程设计模式

    Future 异步创建一个子线程,去完成相关请求任务,然后将处理结果返回给主线程main。在子线程请求并处理数据的...

网友评论

      本文标题:前端针对多次异步请求结果的处理

      本文链接:https://www.haomeiwen.com/subject/bwamqqtx.html