前端处理异步请求顺序

之前有一道面试题 一个模糊搜索组件如何设计 首先防抖截流什么的肯定是能想到了 主要是一个问题 promise有一个缺点 就是如果前一个请求返回比较慢 会导致覆盖最新的请求结果 因此这个问题是最核心的考察点
我们可以参考promise.race原理的思想 返回慢的一直让它pending就好了 因此 我们可以将上一个请求一直pending就好了

function request (t) {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve(t)
        }, t)
    })
}

var map = {}

function getLatest (key, fn, time) {
    if (!map[key]) {
        map[key] = 1
    }
 
    return new Promise((_res, _rej) => {
      resolve = (val) => {
           _res(val)
      } 
      reject = (val) => {
        _rej(val)
      }
      var t = Date.now()
      map[key] = t
      fn(time).then(res => {
          console.log(t, map[key], '/t < map[key]');
          if (t < map[key]) return
          resolve(res)
      }).catch(error => {
          if (t < map[key]) return
          reject(error)
        })
     })
        
   
}
getLatest('a', request, 4000).then(res => {
    console.log(res, '/////')
})

setTimeout(() => {
  getLatest('a', request, 1000).then(res => {
        console.log(res, '//////')
    })
    
}, 1000)

我们只需要将请求包一层promise就可以 如果是上一次的请求 就直接return 这样就取消之前的请求啦🤩
再总结一下promise.race

var race = function (array) {
    return new Promise((resolve, reject) => {
      array.forEach((item) => {
          item.then((res) => {
            resolve(res)
          }).catch((err) => {
              reject(err)
          })
        })
    })
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容