面试必问之Promise

2023-05-16

常见 Promise 面试题

  • 1、了解 Promise 吗?
  • 2、Promise 解决的痛点是什么?
  • 3、Promise 解决的痛点还有其他方法可以解决吗?如果有,请列举。
  • 4、Promise 如何使用?
  • 5、Promise 常用的方法有哪些?它们的作用是什么?
  • 6、Promise 在事件循环中的执行过程是怎样的?
  • 7、Promise 的业界实现都有哪些?
  • 8、能不能手写一个 Promise 的 polyfill。

下面我们一一来解答

Promise 出现的原因------->解决回调地狱的问题

回调地狱:

请求1(function(请求结果1){
    请求2(function(请求结果2){
        请求3(function(请求结果3){
            请求4(function(请求结果4){
                请求5(function(请求结果5){
                    请求6(function(请求结果3){
                        ...
                    })
                })
            })
        })
    })
})

回调地狱带来的负面作用有以下几点:

  • 代码臃肿。
  • 可读性差。
  • 耦合度过高,可维护性差。
  • 代码复用性差。
  • 容易滋生 bug。
  • 只能在回调里处理异常。

类似下面这种同步的写法。 于是 Promise 规范诞生了

let 请求结果1 = 请求1();
let 请求结果2 = 请求2(请求结果1); 
let 请求结果3 = 请求3(请求结果2); 
let 请求结果4 = 请求2(请求结果3); 
let 请求结果5 = 请求3(请求结果4); 

什么是 Promise

Promise 是异步编程的一种解决方案,比传统的异步解决方案【回调函数】和【事件】更合理、更强大。现已被 ES6 纳入进规范中。

代码书写

new Promise(请求1)
    .then(请求2(请求结果1))
    .then(请求3(请求结果2))
    .then(请求4(请求结果3))
    .then(请求5(请求结果4))
    .catch(处理异常(异常信息))

API

  • Promise.resolve(value)
  • //如果传入的 value 本身就是 Promise 对象,则该对象作为 Promise.resolve 方法的返回值返回。  
    function fn(resolve){
        setTimeout(function(){
            resolve(123);
        },3000);
    }
    let p0 = new Promise(fn);
    let p1 = Promise.resolve(p0);
    // 返回为true,返回的 Promise 即是 入参的 Promise 对象。
    console.log(p0 === p1);
    

  • Promise.reject-----类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected。
  • Promise.prototype.then--------实例方法,为 Promise 注册回调函数,函数形式:fn(vlaue){},value 是上一个任务的返回结果,then 中的函数一定要 return 一个结果或者一个新的 Promise 对象,才可以让之后的then 回调接收。
  • Promise.prototype.catch-------实例方法,捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛出的异常信息。
  • Promise.race-------类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败。 。
  • Promise.all-------类方法,多个 Promise 任务同时执行。
    如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个 Promise 任务 rejected,则只返回 rejected 任务的结果。

Promise的使用总结。

Promise 这么多概念,初学者很难一下子消化掉,那么我们可以采取强制记忆法,强迫自己去记住使用过程。

  • 首先初始化一个 Promise 对象,可以通过两种方式创建, 这两种方式都会返回一个 Promise 对象。

    • 1、new Promise(fn)
    • 2、Promise.resolve(fn)
  • 然后调用上一步返回的 promise 对象的 then 方法,注册回调函数。

    • then 中的回调函数可以有一个参数,也可以不带参数。如果 then 中的回调函数依赖上一步的返回结果,那么要带上参数。比如
        new Promise(fn)
        .then(fn1(value){
            //处理value
        })
    复制代码
  • 最后注册 catch 异常处理函数,处理前面回调中可能抛出的异常。

通常按照这三个步骤,你就能够应对绝大部分的异步处理场景。用熟之后,再去研究 Promise 各个函数更深层次的原理以及使用方式即可。

看到这里之后,我们便能回答上面的问题 4 和问题 5了。

Promsie 与事件循环

Promise在初始化时,传入的函数是同步执行的,然后注册 then 回调。注册完之后,继续往下执行同步代码,在这之前,then 中回调不会执行。同步代码块执行完毕后,才会在事件循环中检测是否有可用的 promise 回调,如果有,那么执行,如果没有,继续下一个事件循环。

Promise 的升级

ES6 出现了 async/await 语法,使异步处理更加接近同步代码写法,可读性更好,同时异常捕获和同步代码的书写趋于一致。上面的列子可以写成这样:

(async ()=>{
    let 蔬菜 = await 买菜();
    let 饭菜 = await 做饭(蔬菜);
    let 送饭结果 = await 送饭(饭菜);
    let 通知结果 = await 通知我(送饭结果);
})();

摘自:作者:lucefer
链接:https://juejin.cn/post/6844903625609707534
来源:稀土掘金

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试必问之Promise 的相关文章

随机推荐

  • gazebo版本升级以及环境太暗的解决方法

    gazebo升级 使用下列代码可将gazebo升级为该版本的最新版 xff0c 适用于gazebo7与gazebo9 添加源 sudo sh c 39 echo 34 deb http packages osrfoundation org
  • (3分钟了解)SLAM后端优化的四大金刚!g2o ceres gtsam SE-Sync

    后端优化常用的库有g2o ceres gtsam 和 se sync 这篇博客首先介绍se sync xff0c 然后比较四种库之间的差异 编辑切换为居中 添加图片注释 xff0c 不超过 140 字 xff08 可选 xff09 编辑切换
  • 基于Adams联合MATLAB的联合仿真设置

    因为最近在做一个四足机器人的仿真在网上找了一些资料基本上都不是说得很明白 下面是我参考了一些资料自己做的一个项目和对一些细节做的总结 xff0c 希望对大家有所帮助和解惑 本次联合仿真用到的软件主要是这三个Solidworks2018 Ad
  • MSC_ LICENSE. FILE = D:ladamsMAGNTUDElicense .dat

    ADAMS一段时间不使用后重新打开出现 解决办法 xff1a 1 找到原下载解压后的文件目录 2 点击MSC Calc 20161130 exe按照提示重新生成license dat文件 3 复制新的license dat文件到之前安装AD
  • 两块STM32F1之间互相通信(串口)

    首先准备两块STM32F103的板子 xff0c 以我这个为例 xff0c 我准备了一块STM32F103和CH32F103最小系统板子 xff0c 其他杜邦线 下载器及接线方法以及通信原理不再多说 这里我用的是STM32F103最小系统发
  • STM32单片机与蓝牙模块HC-05通信数据帧处理

    本章将会详细讲述蓝牙模块 xff08 HC 05 xff09 和STM32单片机之间的通信收发的数据如何处理 xff0c 在测试开始前首先在手机上下载好一个蓝牙调试APP xff0c 此APP可以是手机端和PC端口的 xff0c 以我常用的
  • N32G031固件库开发(三)基本TIM6定时器中断

    基本定时器 TIM6 基本定时器简介 基本定时器 TIM6 包含一个 16 位自动装载计数器 基本定时器主要特性 16位自动重载向上计数计数器 16位可编程预分频器 xff08 分频系数可配置为 1到 65536之间的任意值 xff09 产
  • N32G031固件库开发(四)通用定时器TIM3----PWM输出

    4 通用定时器 xff08 TIM3 xff09 通用定时器 xff08 TIM3 xff09 主要用于以下场合 xff1a 对输入信号进行计数 测量输入信号的脉冲宽度和产生输出波形等 4 1 TIM3 主要特性 16 位自动装载计数器 x
  • N32G031固件库开发(五)高级定时器TIM1----PWM输出

    高级控制定时器 xff08 TIM1 和 和 TIM8 xff09 5 1 TIM1 和 和 TIM8 简介 高级控制定时器 xff08 TIM1 和 TIM8 xff09 主要用于以下场合 xff1a 对输入信号进行计数 测量输入信号的脉
  • Java并发之semaphore(信号量)

    文章目录 1 官方解读2 通俗易懂的例子解析3 代码解析4 Semaphore的应用5 类结构和相关方法 1 类结构 2 acquire 方法 3 release 方法 6 总结 1 官方解读 semaphore信号量就是并发工具类 Sem
  • 程序员面试题精选100题(46)-对称子字符串的最大长度

    程序员面试题精选100题 46 xff0d 对称子字符串的最大长度 题目 xff1a 输入一个字符串 xff0c 输出该字符串中对称的子字符串的最大长度 比如输入字符串 google xff0c 由于该字符串里最长的对称子字符串是 goog
  • Ubuntu12.04执行apt-get update时报错的问题解决

    报错内容示例 W Failed to fetch http us old releases ubuntu com ubuntu dists precise updates Release gpg Something wicked happe
  • arduino烧写报错:can‘t open device “\\.\COM1“

    我的解决办法是拔掉usb xff0c 让它关机 xff0c 停止运行一会 xff0c 它便可恢复 记得之前也有一次 xff0c 那次解决好像是通过修改它的端口号 xff0c 例如我将它com8修改为com1 两个方法都可以尝试下 xff0c
  • UDP服务器/客户端Linux下C代码实现以及广播、组播

    目录 UDP广播流程 组播流程 UDP UDP xff08 User Datagram Protocol xff09 用户数据报协议 xff0c 是不可靠的无连接的协议 在数据发送前 xff0c 因为不需要进行连接 xff0c 所以可以进行
  • CMakeLists.txt常用语法

    CMakeLists txt常用语法 cmake minimum requiredprojectadd executableinclude directoriesadd libraryalias library xff08 别名库 xff0
  • git 合并分支

    假如我们现在在dev分支上 xff0c 刚开发完项目 xff0c 执行了下列命令 xff1a git add git commit m 39 提交的备注信息 39 git push u origin dev 想将dev分支合并到master
  • 月薪35k的简历是怎么包装的 ,让面试官心动的标准简历(附模板分享)

    有过面试的都知道 xff0c 不管怎样 xff0c 面试多多少少都和简历有这很重要的 毕竟面试官要通过简历了解面试者的基本信息 过往经历 xff0c 来判断面试者和岗位的匹配度 面试者期望通过简历把自己较好的一面体现给面试官 xff0c 所
  • 对无人机高度环的思考和第一次炸机体验

    前两天学长布置了一个任务 xff0c 大体就是在无人机起飞一段时间后再次改变飞行高度 一开始我觉得挺简单 xff0c 随便改改就行了 xff0c 所以今天才开始写 xff0c 然后 炸机了 先说说第一次炸机的体验 就是看到无人机炸机的疯狂往
  • 21年电赛无人机G题思路

    21年电赛结束了 xff0c 我们选择的题目是无人机G题 通过题目也能感受到今年的难度 xff0c 在这里旨在为大家提供一个G题的解题思路和方案 读完题目 xff0c 可以发现主要有两个难题需要解决 1 飞行路径问题 xff08 如何确保飞
  • 面试必问之Promise

    常见 Promise 面试题 1 了解 Promise 吗 xff1f 2 Promise 解决的痛点是什么 xff1f 3 Promise 解决的痛点还有其他方法可以解决吗 xff1f 如果有 xff0c 请列举 4 Promise 如何