前言
Promise作为面试中的经典考题,我们一定要深刻学习和理解它! Promise有什么用呢?答:我们拿它解决异步回调问题。Pomise是ES6里面新增的一种异步编程的解决方案。现在这个promise在面试中感觉就像“css清除浮动”一样,属于答不上来就会挂掉的前端基础知识了。
本文大纲:
1.promise基本用法;
2.promise A+手动实现
3.promise 使用中的哪些坑 promise.all 回调地狱等;
(一)promise基本用法
promise对象简单的来说,有点类似于ajax,它可以看做是一个装有某个未来才会结束的事件的容器。它有两个特点:1,promise的状态不受外部影响;2.promise的状态一旦改变,就不会再变了。
可以先看下promise的结构
function Promise(executor){
var self = this
self.status = 'pending' // Promise当前的状态
self.data = undefined // Promise的值
self.onResolvedCallback = [] // Promise resolve时的回调函数集,因为在Promise结束之前有可能有多个回调添加到它上面
self.onRejectedCallback = [] // Promise reject时的回调函数集,因为在Promise结束之前有可能有多个回调添加到它上面
executor(resolve, reject) // 执行executor并传入相应的参数
}
promise的结构简单来说就是,它有个status表示三种状态**,pending(挂起),resolve(完成),reject(拒绝)。除此之外,它还有两个回调方法onResolvedCallback** 和 onRejectedCallback,分别对应resolve(完成) 和reject(拒绝)。
假如前面面试官问你promise的概念和基本用法,你像我一样提到了ajax的话,面试官很可能就会顺口问一下ajax(毕竟也是前端应该掌握得基础知识之一)。根据我的经验来看,一线大厂的面试官这个时候很可能会要你用promise撸一个ajax出来,一来可以考察你promise和ajax掌握得怎么样,二来可以考察你的代码能力。
1.1用promise来实现Ajax
const $ = (function(){
const ajax = function(url, async = false, type = 'GET'){
const promise = new Promise(function(resolve, reject){
const handler = function(){
if(this.read