资讯专栏INFORMATION COLUMN

密集调用, 缓慢执行---一个特殊的延迟函数

chengtao1633 / 1249人阅读

摘要:前段时间开发过程中遇到一个特殊的需求起初写了一个简单的爬虫用来爬取本地文档中所有的接口数据先随机访问一个页面拿到侧边栏的所有连接然后写一个循环使用访问各个连接依次拿到所对应的数据代码类似但是这时出现了一个问题因为接口数量比较多大概个所以方法

前段时间开发过程中遇到一个特殊的需求:
起初写了一个简单的爬虫, 用来爬取本地showdoc文档中所有的接口数据. 先随机访问一个页面, 拿到侧边栏的所有连接, 然后写一个循环, 使用node访问各个连接依次拿到所对应的数据
代码类似

Promise.all(urls.map(url => get(url))).then(resultArr => {
    ...
})

但是这时出现了一个问题, 因为接口数量比较多 (大概500个) 所以get方法一次发送了500个左右请求, 结果node会报错 socket hung up , 导致部分请求无法正常返回数据, 原因大概是请求太多 socket 被耗尽了(也可能是服务器的原因), 第一个想到的就是节流/去抖函数, 但是网上找了一圈, 发现没有合适我这个需求的, 我需要在短时间多次调用,
然后在之后的一段时间,把积累的调用次数慢慢的执行完, 一个都不能少!
没办法,只好自己写了一个. 在这里记录一下.

function delayCall(fn, delay) {
  let arr = [] //用来储存每次调用传入的参数
  //延迟调用函数
  const _delayCall = function(context) {
    setTimeout(() => {
      //队列最前面的参数出队列
      arr.shift()
      //如果队列中还有未调用的参数, 则递归调用直到耗尽队列中的参数
      if(arr.length > 0) {
        fn.apply(context, arr[0])
        _delayCall(context)
      }
    }, delay)
  }
  return function() {
    const context = this
    arr.push(arguments)
    if(arr.length === 1) {
      //第一次调用时立即调用
      fn.apply(context, arguments)
      _delayCall(context)
    }
  }
}







可以用一段代码测试

let i = 5
const delay = delayCall(function(e){ console.log(e) }, 500)
while(i--) delay(i)


这个函数可以实现密集调用, 缓慢执行的效果. 不介意的就收藏下,说不定以后用的着呢 ^_^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90458.html

相关文章

  • 精读《高性能 javascript》

    摘要:嵌套对象成员会造成重大性能影响尽量少用。一般来说你可以通过这种方法提高代码的性能将经常使用的对象成员数组项和域外变量存入局部变量中。在反复访问的地方使用局部变量存放引用小心地处理集合因为他们表现出存在性总是对底层文档重新查询。 前言 本期我来给大家推荐的书是《高性能JavaScript》,在这本书中我们能够了解 javascript 开发过程中的性能瓶颈,如何提升各方面的性能,包括代码...

    caohaoyu 评论0 收藏0
  • Node - 异步IO和事件循环

    摘要:它是在的基础上改进的一种方案,通过对文件描述符上的事件状态进行判断。检索新的事件执行与相关的回调几乎所有情况下,除了关闭的回调函数,它们由计时器和排定的之外,其余情况将在此处阻塞。执行事件的,例如或者。 前言 学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的...

    MyFaith 评论0 收藏0
  • 高性能javascript小结

    摘要:高性能小结文章转载于我的博客最近看完了动物丛书的高性能,觉得那本书的小结部分写得非常不错,简洁轻快易懂概括性很强。由于局部变量存在于作用域链的起始位置,因此访问局部变量比访问跨作用域变量更快。 高性能javascript小结 文章转载于我的CSDN博客:http://blog.csdn.net/hello_world_20/article/details/46793317 最近看完了动...

    wujl596 评论0 收藏0
  • 云存储主要技术路线选型比较

    摘要:云存储主要技术路线有哪些各有哪些优缺点分享一存储虚拟化存储虚拟化更多是对传统块的虚拟化。也是云存储的主流当家花旦。哪些应用场景适合云存储?存储虚拟化、分布式存储、对象存储这几种技术主要解决什么问题?技术产品选型如何考虑? 企业哪些应用场景适合借助云存储来实现? 传统 IT 环境中使用传统存储的困境有那些?那些应用场景是传统存储不能满足而必须借助云存储来实现的? 分享一: ...

    zlyBear 评论0 收藏0
  • 云存储主要技术路线选型比较

    摘要:云存储主要技术路线有哪些各有哪些优缺点分享一存储虚拟化存储虚拟化更多是对传统块的虚拟化。也是云存储的主流当家花旦。 哪些应用场景适合云存储?存储虚拟化、分布式存储、对象存储这几种技术主要解决什么问题?技术产品选型如何考虑?企业哪些应用场景适合借助云存储来实现?传统 IT 环境中使用传统存储的困境有那些?那些应...

    阿罗 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<