2023前端面试纪实-上海

188 阅读1分钟

Promise.allSettled是做什么的

用于并行处理多个 promise 的,但是无论每个 promise 是成功还是失败,它都会返回一个新的 promise。当所有 promise 都完成时,Promise.allSettled 会返回一个新的 promise,该 promise 会解析为每个原始 promise 的结果集,无论这些结果是成功还是失败。每个结果都将是一个对象,该对象包含一个状态代码(status)和一个结果(value 或 reason)。如果某个 promise 成功,则其状态代码为 "fulfilled",结果为该 promise 的值。如果某个 promise 失败,则其状态代码为 "rejected",结果为该 promise 的拒绝原因

手写Promise.all

const promiseAll = (promises) => {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(promises)) {
      throw new TypeError(`promises must be an array`);
    }
    let resolveCounter = 0;
    let promiseNum = promises.length;
    const resolveResult = [];
    for (let i = 0; i < promiseNum; i++) {
      Promise.resolve(promises[i]).then(
        (value) => {
          resolveCounter++;
          resolveResult[i] = value;
          if (resolveCounter == promiseNum) {
            return resolve(resolveResult);
          }
        },
        (error) => {
          return reject(error);
        }
      );
    }
  });
};

什么是HTTP队头堵塞,如何解决

  • 问题: HTTP传输到报文必须是一发一收,但是,里面的任务被放到一个任务队列中串行执行,一旦队首到请求处理太慢,就会阻塞后面的请求的处理。
  • 解决方案:
    • 并发连接:对于一个域名允许分配多个长任务,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其他所有任务。
    • 域名分片:将域名分出很多二级域名,它们都指向同样的一台服务器,能够并发的长连接数变多,解决队头阻塞的问题。

React中Portals是做什么的?

Portalt 提供看一种将子节点渲染到存在于父组件以外的DOM节点上。

ReactDOM.createPortal(child,container)

Cookie、Session、Token是什么?

React如何创建一个响应式的Context?