• 面试题之promise篇


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

    2、Promise 解决的痛点是什么?
    1)回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象,是为解决异步操作函数里的嵌套回调(callback hell)问题,代码臃肿,可读性差,只能在回调里处理异常

    2)promise可以支持多个并发的请求,获取并发请求中的数据

    3)promise可以解决可读性的问题,异步的嵌套带来的可读性的问题,它是由异步的运行机制引起的,这样的代码读起来会非常吃力

    4)promise可以解决信任问题,对于回调过早、回调过晚或没有调用和回调次数太少或太多,由于promise只能决议一次,决议值只能有一个,决议之后无法改变,任何then中的回调也只会被调用一次,所以这就保证了Promise可以解决信任问题

    3、Promise 解决的痛点还有其他方法可以解决吗?如果有,请列举。
    1)Promise 解决的痛点还有其他方法可以解决,比如setTimeout、事件监听、回调函数、Generator函数,async/await

    2)setTimeout:缺点不精确,只是确保在一定时间后加入到任务队列,并不保证立马执行。只有执行引擎栈中的代码执行完毕,主线程才会去读取任务队列

    3)事件监听:任务的执行不取决于代码的顺序,而取决于某个事件是否发生

    4)Generator函数虽然将异步操作表示得很简洁,但是流程管理却不方便(即何时执行第一阶段、何时执行第二阶段)。即如何实现自动化的流程管理

    5)async/await

    4、Promise 如何使用?
    1)创造一个Promise实例

    2)Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数

    3)可用Promise的try和catch方法预防异常

    5、Promise 常用的方法有哪些?它们的作用是什么?
    1)Promise.resolve(value)

    类方法,该方法返回一个以 value 值解析后的 Promise 对象
    如果这个值是个 thenable(即带有 then 方法),返回的 Promise 对象会“跟随”这个 thenable 的对象,采用它的最终状态(指 resolved/rejected/pending/settled)
    如果传入的 value 本身就是 Promise 对象,则该对象作为 Promise.resolve 方法的返回值返回
    其他情况以该值为成功状态返回一个 Promise 对象

    2)Promise.reject

    类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected

    3)Promise.prototype.then

    实例方法,为 Promise 注册回调函数,函数形式:fn(vlaue){},value 是上一个任务的返回结果,then 中的函数一定要 return 一个结果或者一个新的 Promise 对象,才可以让之后的then 回调接收

    4)Promise.prototype.catch

    实例方法,捕获异常,函数形式:fn(err){}, err 是 catch 注册 之前的回调抛出的异常信息

    5)Promise.race

    类方法,多个 Promise 任务同时执行,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败

    6)Promise.all

    类方法,多个 Promise 任务同时执行
    如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果。 如果有一个 Promise 任务 rejected,则只返回 rejected 任务的结果

    6、Promise 在事件循环中的执行过程是怎样的?
    1)事件循环

    从代码执行顺序的角度来看,程序最开始是按代码顺序执行代码的,遇到同步任务,立刻执行;遇到异步任务,则只是调用异步函数发起异步请求。此时,异步任务开始执行异步操作,执行完成后到消息队列中排队。程序按照代码顺序执行完毕后,查询消息队列中是否有等待的消息。如果有,则按照次序从消息队列中把消息放到执行栈中执行。执行完毕后,再从消息队列中获取消息,再执行,不断重复。由于主线程不断的重复获得消息、执行消息、再取消息、再执行

    2)promise的事件循环

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

    7、Promise 的业界实现都有哪些?
    1) promise可以支持多个并发的请求,获取并发请求中的数据

    2)promise可以解决可读性的问题,异步的嵌套带来的可读性的问题,它是由异步的运行机制引起的,这样的代码读起来会非常吃力

    8、 Promise的问题?解决办法?
    promise的问题为:

    promise一旦执行,无法中途取消

    promise的错误无法在外部被捕捉到,只能在内部进行预判处理

    promise的内如何执行,监测起来很难

    解决办法

    正是因为这些原因,ES7引入了更加灵活多变的async,await来处理异步



    再宏伟的目标,拆分下来,也只是一串串的代码而已;一串串的代码,细分来看,也只是一个一个的字母而已!也许,我做不到一晚上完成大神一小时随便敲打的项目,但为这一目标,每天添砖加瓦,我想我应该是可以完成的!
  • 相关阅读:
    Struts的ONGL
    深度解析 Qt 中动态链接库
    QTcpSocket 发送数据的几种方法
    QT GUI总结
    Qt 插件学习(一)
    Qt自定义窗口部件
    Qt事件机制浅析
    VS2008 Qt Designer 中自定义信号槽
    Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
    QT中窗口刷新事件的学习总结
  • 原文地址:https://www.cnblogs.com/Annely/p/14749690.html
Copyright © 2020-2023  润新知