前端Promise相关面试题以及知识点

什么是Promise?

Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

 

我们用Promise来解决什么问题?

promise是用来解决两个问题的:

  • 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
  • promise可以支持多个并发的请求,获取并发请求中的数据
  • 这个promise可以解决异步的问题,本身不能说promise是异步的

相关资料:

https://juejin.im/post/5e650f646fb9a07cb83e3209

https://juejin.im/post/5a9516885188257a6b061d72

https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544

https://blog.csdn.net/weixin_41817034/article/details/80492315

面试题:

https://www.jianshu.com/p/84ef1b48fcce

常见 Promise 面试题

我们看一些 Promise 的常见面试问法,由浅至深。

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

这些问题,如果你都能 hold 住,那么面试官基本认可你了。带着上面这些问题,我们往下看。

Promise 出现的原因

  在 Promise 出现以前,我们处理一个异步网络请求,大概是这样:

// 请求 代表 一个异步网络调用。
// 请求结果 代表网络请求的响应。
请求1(function(请求结果1){
    处理请求结果1
})

看起来还不错。
但是,需求变化了,我们需要根据第一个网络请求的结果,再去执行第二个网络请求,代码大概如下:

请求1(function(请求结果1){
    请求2(function(请求结果2){
        处理请求结果2
    })
})

看起来也不复杂。
但是需求是永无止境的,于是乎出现了如下的代码:

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

这回傻眼了。。。 臭名昭著的 回调地狱 现身了。

更糟糕的是,我们基本上还要对每次请求的结果进行一些处理,代码会更加臃肿,在一个团队中,代码 review 以及后续的维护将会是一个很痛苦的过程。

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

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

出现了问题,自然就会有人去想办法。这时,就有人思考了,能不能用一种更加友好的代码组织方式,解决异步嵌套的问题。

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

类似上面这种同步的写法。 于是 Promise 规范诞生了,并且在业界有了很多实现来解决回调地狱的痛点。比如业界著名的 Qbluebirdbluebird 甚至号称运行最快的类库。

看官们看到这里,对于上面的问题 2 和问题 7 ,心中是否有了答案呢。

什么是 Promise

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

代码书写比较

还是使用上面的网络请求例子,我们看下 Promise 的常规写法:

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

比较一下这种写法和上面的回调式的写法。我们不难发现,Promise 的写法更为直观,并且能够在外层捕获异步函数的异常信息。


 

猜你喜欢

转载自blog.csdn.net/qq_22182989/article/details/106891543