前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蚂蚁金服在线笔试:如何防止重复发送请求?

蚂蚁金服在线笔试:如何防止重复发送请求?

作者头像
前端胖头鱼
发布2022-07-25 08:42:26
4110
发布2022-07-25 08:42:26
举报
文章被收录于专栏:胖头鱼学前端胖头鱼学前端

前言

胖头鱼最近在整理一些以往亲身经历的面试真题时,发现了一道很有意思的题目,来自蚂蚁金服某次在线笔试。如何防止重复发送请求? 有没有发现平时的业务也会有类似的场景需要处理?看来蚂

真题再现

问题:业务需求中,经常有只需要请求一次,以防止用户重复点击行为导致触发重复请求。

传递请求方法(执行后返回promise),返回一个新方法。连续触发时,只执行一次。

代码语言:javascript
复制

// 示例
let count = 1;
let promiseFunction = () =>
  new Promise(rs =>
    window.setTimeout(() => {
      rs(count++);
    })
  );
let firstFn = firstPromise(promiseFunction);
firstFn().then(console.log); // 1
firstFn().then(console.log); // 1
firstFn().then(console.log); // 1

解析

题目的原意是阻止重复发送请求firstFn执行的回调复用这一个请求的结果,那么实现就很简单啦!可以将请求的实例先存储起来,而成功和失败内部都可以感知到,进而将其重新置空,接受下一次请求。

代码语言:javascript
复制

function firstPromise(promiseFunction) {
  let p = null;
  return function (...args) {
    // 请求的实例,已存在意味着正在请求中,直接返回实例,不触发新的请求
    return p
      ? p
      // 否则发送请求,且在finally时将p置空,那么下一次请求可以重新发起
      : (p = promiseFunction.apply(this, args).finally(() => (p = null)));
  };
}

测试一下

代码语言:javascript
复制
let count = 1;
let promiseFunction = () =>
  new Promise((rs) =>
    setTimeout(() => {
      rs(count++);
    }, 1000)
  );
let firstFn = firstPromise(promiseFunction);
firstFn().then(console.log); // 1
firstFn().then(console.log); // 1
firstFn().then(console.log); // 1

setTimeout(() => {
  firstFn().then(console.log); // 2
  firstFn().then(console.log); // 2
  firstFn().then(console.log); // 2
}, 3000);

可以看到虽然我们调用了firstFn6次,但是实际请求只发生了两次(因为count只由1变成了2),恭喜,蚂蚁的笔试题你通过了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端胖头鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 真题再现
    • 解析
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档