promise规范及应用

162 阅读5分钟

异步解析

1.进程 & 线程

概念 与 区别
   概念:
      1、进程是操作系统分配资源的最小单位,进程是资源的使用单位;
      2、线程是进程的子单位,线程是资源的使用单位;
   区别:
      1、线程是进程的一部分,所以线程有时被称为轻量级进程或者轻权进程;
      2、一个没有线程的进程,叫做单线程进程;如果一个进程有至少一个线程,那么这个进程就叫做多线程进程;
      3、系统运行时会为每一个进程分配不同的内存区域,但不会为线程分配内存,线程只只能共享进程的内存;
面试题
   1、浏览器新打开一个窗口,这个窗口是属于哪个进程的?   --进程
   2、窗口(进程)间通信  --(主要指的是同源)本地存储、Web SocketWeb Worker;
      -本地存储:cookie、localStorage区别
         -cookie :大小限制4kb,过期时间,可能会被劫持 -localStorage :大小无限制,手动清理、只存储在浏览器端;
         -安全性、应用场景:
            *cookie安全性较低,容易受到跨站脚本(xss)攻击,应用于登陆认证、个性化体验、购物车等场景;
            *localStorage安全性较高,可能遭受同一网址的跨站点脚本攻击(通过编码和过滤避免注入危险数据),应用于长期存储、本地应用程序、网页存储数据;
   3、浏览器原理
      a、客户端与服务端通信:浏览器作为客户端,在用户输入url、点击按钮或者其他交互操作是发起的http请求到指定的web服务器。这个过程通常涉及TCP/IP协议栈,首先建立连接,然后通过http协议进行数据交换。
      b、http请求与响应:在发送请求时,浏览器会包括一些关键信息,如请求方法(GETPOST灯)、资源路径(URL)、以及请求头(如User-AgentCookieAuthorization等信息)。服务器接收到请求后,基于http状态码(例如200表示成功响应,404表示未找到页面)返回相应的响应内容,这包括HTML文档、图片JavaScript文件、样式表css等资源。
      c、解析与渲染HTML:当浏览器接收到HTML文档后,它首先解析文档结构,并应用css样式进行布局显示。这个过程涉及到DOMdocument object model),即文档对象模型,它是html文档的树状结构表示形式,允许脚本动态改变HTML内容和文档的行为。
      d、资源加载与缓存管理:浏览器在解析网页时同时异步加载依赖的资源,如JavaScript文件、图像、视频等。为了提高性能,浏览器还利用了多种技术进行资源预加载、缓存策略、同源策略等来减少网络延迟时间。
      e、JavaScript运行环境:现代浏览器支持ECMAScriptES)标准的JavaScript语言,用于创建交互页面应用。JavaScript可以在客户端运行允许开发者编写功能丰富的动态页面,增强用户体验并提供实时交互能力。
      f、网页安全与隐私保护:为了保障用户的网络安全与隐私,浏览器实现了多种机制,如同源政策限制跨域访问,https加密传输防止数据泄密,以及对恶意脚本的检测和阻止等。

EVENT-LOOP(事件循环)

a、执行栈
  • JS单线程
b、面试题
  • JS堆栈执行顺序以及堆栈溢出 (--后进先出) => 白屏
  • 执行顺序题:先同步再异步,异步分为:宏任务和微任务,先执行宏任务,在宏任务执行末尾执行微任务,微任务执行完成后,执行下一个宏任务。
   // 宏任务:setTimeout、setInterval、ajax、script、setImmediate、I/O、UI渲染
   // 微任务:promise、MutationObserver(用于观察DOM变化)、process.nextTick`(Node.js环境)
   setTimeout(() => {
      console.log('宏任务1') // 5
   })
   // 宏任务2
   new Promise((resolve, reject) => {
      console.log('微任务1') //1
      resolve()
   }).then(() => {
      console.log('微任务2') //3
   }).then(() => {
      console.log('微任务3') // 4
   })
   console.log('同步任务') //  2

Promise

a、回调地狱的 解决方案
b、promise拯救的回调导致的无穷嵌套
   const wait500 = (fn) => {
      new Promise((resolve, reject) => {
         console.log('500ms')
         setTimeout(() => {
            resolve(fn+500)
         },500)
      })
   }
   const wait1000 = (fn) => {
      new Promise((resolve, reject) => {
         console.log('1000ms')
         setTimeout(() => {
            resolve(fn+1000)
         },1000)
      })
   }
   const p = new Promise((resolve, reject) => {
      resolve(1)
   })
   p.then(wait500).then(wait1000).then(res => {
      console.log(res)
   })
   // all 是等待所有的promise执行完,才执行then
   Promise.all([wait500(1), wait1000(1)]).then(res =>{
      console.log(res)
   })
   // race 是等待第一个promise执行完,才执行then
   Promise.race([wait500(1), wait1000(1)]).then(res =>{
      console.log(res)
   })
c、面试 - Promise A+
  • promise有哪些状态?对应值有哪些?
    • 状态: pending、fulfilled、rejected;对应值:undefined、value、reason;
  • promise的默认状态是什么?状态是如何让流转?
    • promise的默认状态是pending;状态流转:pending => fulfilled | pending => rejected;
  • promise的返回值?
    • then;接收 onFulfilled和 onRejected,如果then.promise已经成功,执行onFulfilled,参数value如果then.promise已经失败,执行onRejected,参数reason,then中有任何error异常 => onRejected;
  • 手写promise
   // 执行状态常量值
   const PENDING = 'PENDING';
   const FULFILLED = 'FULFILLED';
   const REJECTED = 'REJECTED';
   class Promise {
      constructor(executor) {
         // 默认状态
         this.status = PENDING;
         // 成功/失败的值
         this.value = undefined;
         this.reason = undefined;
         // 存放成功的回调
         this.onResolvedCallbacks = [];
         // 存放失败的回调
         this.onRejectedCallbacks = [];
         // 成功的方法
         const resolve = value => {
            this.status = FULFILLED;
            this.value = value;
            this.onResolvedCallbacks.forEach(fn => fn())
         }
         // 失败的方法
         const reject = reason => {
            this.status = REJECTED;
            this.reason = reason;
            this.onREjectedCallbacks.forEach(fn => fn())
         }
         // 主执行
         try{
            executor(resolve, reject);
         } catch(err) {
            reject(err);
         }
      }
      // 成功
      if(this.status === FULFILLED) onFulfilled(this.value);
      // 失败
      if(this.status === REJECTED) onRejected(this.reason);
      // 默认状态 .then 接收onFulfilled和 onRejected
      if(this.status === PENDING) {
         // 存放队列栈
         this.onResolvedCallbakcs.push(() => {
            onFulfilled(this.value)
         })
         this.onRejectedCallbacks.push(() => {
            onRejected(this.reason)
         })
      }
   }