LogoLogo
github
  • 💪Upupup
  • React
    • hook
    • redux
    • Router
    • umimax+nest.js 实现 权限管理系统
    • umimax + Nest.js 实现权限管理系统
  • Vue
    • effectScope 是干啥的
    • Object.assign()
    • 响应式理解
    • @babel/preset-env 问题
    • 自定义指令
    • 问题及解决
    • 🧐权限管理(动态路由)
  • docker
    • Docker 常用命令
    • Docker部署遇到的问题
    • Docker Compose 常用命令
    • docker修改daemon.json
    • jenkins
    • Jenkinsfile 语法进阶
    • nginx配置
    • 问题
    • 玩转Nginx:轻松为Docker部署的服务添加域名的完美指南
    • Docker部署前后端项目:经验分享与问题解决
  • git
    • command
    • problem
    • rebase实践
  • 前端开发面试题集
    • CSS 面试题
    • 前端工程化面试题
    • HTML 面试题
    • JavaScript 面试题
    • NestJS 面试题
    • Node.js 面试题
    • 性能优化面试题
    • React 面试题
    • 安全面试题
    • Vue 面试题
  • interviewer
    • 计算机网络
    • 性能优化
  • leetcode
    • 算法
      • 分治算法
      • 滑动窗口与双指针
        • 🦸定长滑动窗口
        • 🚴不定长滑动窗口
        • 🚴‍♂️单序列双指针
      • 回溯
      • 二分法
  • nestjs
    • mail
    • mini-order
    • nestjs
    • prisma
    • 登录注册
  • nextjs
    • 用 V0 和 Cursor 实现全栈开发:从小白到高手的蜕变
  • tauri
    • 思路
    • 自动通知应用升级
  • vite
    • vite实现原理
  • webpack
    • 资料
  • 工具
    • Eslint
    • jenkins
    • 关于cicd
  • 微信小程序
    • ScoreDeck
    • h5跳转小程序问题
  • 思路
    • carTool
  • 操作系统学习
    • Linux命令
    • 计算机是如何计数的
    • nginx
      • location
      • try_files
  • 浏览器
    • session、location
    • web crypto
    • 性能监控和错误收集与上报
    • 预请求
  • 知识点整理
    • 知识点整理
  • 面试
    • Promise
    • 备战
    • 数码3
    • 腾娱
    • 腾讯云智
    • 重复请求合并
  • 前端工程化
    • 在 pnpm Monorepo 中使用公共方法包
由 GitBook 提供支持
在本页

这有帮助吗?

在GitHub上编辑
  1. 面试

重复请求合并

上一页腾讯云智下一页前端工程化

最后更新于5个月前

这有帮助吗?

假设现在后端有一个服务,支持批量返回书籍信息,它接受一个数组作为请求数据,数组储存了需要获取书目信息的书目 id,这个服务 fetchBooksInfo 大概是这个样子:

const fetchBooksInfo = bookIdList => {
    // ...
    return ([{

            id: 123,
            // ...

        },
        {
            id: 456
            // ...
        },
        // ...
    ])
}
fetchBooksInfo 已经给出, 但是这个接口最多只支持 100 个 id 的查询。

现在需要开发者实现 getBooksInfo 方法,该方法:

支持调用单个书目信息:

getBooksInfo(123).then(data => {console.log(data.id)}) // 123
短时间(100 毫秒)内多次连续调用, 只发送一个请求 ,且获得各个书目信息:


getBooksInfo(123).then(data => {console.log(data.id)}) // 123
getBooksInfo(456).then(data => {console.log(data.id)}) // 456
注意这里必须只发送一个请求,也就是说调用了一次 fetchBooksInfo。
const bookIdListToFetch = []
const promiseMap  = {}

const getUniqueArray =array = >Array.from(new Set(array))
let timr 
const getBookInfo = bookId => new Promise((resolve,reject)=>{
promiseMap[bookId] = promiseMap[bookId]||[]
promiseMap[bookId].push({resolve,reject})
})
const clearTask = () =>{
	bookIdListToFetch  = []
	promiseMao = {}
}
if(bookIdListToFetch.length===0){
	bookIdListToFetch.push(bookId)
	timer = setTimeout(()=>{
	handleFetch(bookIdListToFetch,promiseMap)
	clearTask()
	},100)
}else{
	bookIdListToFetch.push(bookId)
    bookIdlistToFetch = getUniqueArray(bookIdListoFetch)
    if(bookIdListToFetch.length>=100){
        clearTimeout(timer)
        handleFetch(bookIdListFetch,promiseMap)
        clearTask()
    }
}
const handleFetch = (list, map) => {
    fetchBooksInfo(list).then(resultArray => {
        const resultIdArray = resultArray.map(item => item.id)

        // 处理存在的 bookId
        resultArray.forEach(data => promiseMap[data.id].forEach(item => {
            item.resolve(data)
        }))

        // 处理失败没拿到的 bookId
        let rejectIdArray = []
        bookIdListToFetch.forEach(id => {
            // 返回的数组中,不含有某项 bookId,表示请求失败
            if (!resultIdArray.includes(id)) {
                rejectIdArray.push(id)
            }
        })

        // 对请求失败的数组进行 reject
        rejectIdArray.forEach(id => promiseMap[id].forEach(item => {
            item.reject()
        }))
    }, error => {
        console.log(error)
    })
}
异步不可怕“死记硬背”+ 实践拿下(上) | 前端进阶 (mbear.top)