8.10面试题(promise+防抖+节流+token)

157 阅读1分钟

Promise链式阶乘

function fn1() {
  function multiply(a, b, callback) {
    setTimeout(() => {
      const ret = a * b;
      callback(ret);
    }, 2000);
  }
  // multiply(2,3,ret=>console.log("ret=",ret))

  /* 但凡耗时任务的结果,要么回调,要么Promise */
  function mulPromise(a, b) {
    return new Promise((resolve, reject) => {
      multiply(2, 3, (ret) => resolve(ret));
    });
  }

  //   mulPromise(2, 3)
  //     // .then((ret) => ret * 4)
  //     .then((ret) => mulPromise(ret, 4))
  //     .then((ret) => mulPromise(ret, 4))
  //     .then((ret) => console.log("最终结果", ret));

  /* await */
  ~(async function awaitDemo() {
    try {
      let ret = await mulPromise(2, 3);
      ret = await mulPromise(ret, 4);
      ret = await mulPromise(ret, 5);
      console.log("最终结果", ret);
    } catch (err) {
      console.log("err=", err);
    }
  })();
}
// fn1();

防抖

const inputHander = (e) => {
  console.log(e.target.value);
};
function debounce(fn, delay = 1000) {
  let timer = null;
  return function dfn(...args) {
    /* 新的fn调用时 若发现上次还有没来得及回调的fn 直接取消 */
    timer && clearTimeout(timer);

    // 1秒后回调本次fn
    timer = setTimeout(() => {
      fn.apply(null, args);
      timer = null;
    }, delay);
  };
}
ip.addEventListener("input", debounce(inputHander, 1000));

节流

const clickHandler = (e) => {
  console.log("hello");
};
function throttle(fn, delay = 1000) {
  let forbidTimer = null;

  return function (...args) {
    if (!forbidTimer) {
      fn.apply(null, args);

      // 1秒内不允许再有人来调用fn
      forbidTimer = setTimeout(() => {
        forbidTimer = null;
      }, delay);
    }
  };
}
btn.addEventListener("click", throttle(clickHandler, 1000));

JSON Web Token

  • 作用:登录鉴权 单点登录(多点开花)
  • 细节:
  • token构成:头部(算法等配置信息)+载荷(用户的详细信息)+签名(头+载荷+秘钥三合一综合计算而成)
  • token签发:用户在A服务器登录,成功以后A服务器做三合一的计算得到一个token,作为登录结果返还客户端
  • token携带:客户端通过请求头【authorization:Bearer xxx】携带
  • token校验:B服务器与A服务器持有相同的JWT秘钥,可以对用户携带的token进行校验
  • 核心库API:
  • const token = jsonwebtoken.generate(payload,secret)
  • const payloadOrFalse = jsonwebtoken.verify(token,secret)
  • 注意事项:保管好秘钥 */