蛋老师说过,如果想要自己的技术有提升就需要学会手写Promise 所以为了技术(工资)我来了。
先看看几本的Promise怎么用
// 这就是一个最简单的promise调用。
new Promise((resolve)){
setTimeOut(function(){
console.log('nihia')
resolve('nihao')
})
}
以前都是死记硬背的。那天面试的都时候居然忘记了resolve()要放在异步函数里面。现在都记得面试看我的眼神。能怪谁了。怪自己照着文档写就惯了,大家千万不要裸面啊!!
所以痛定思痛,开始搞明白这个玩意到底是什么东西。
function Promise(fn){
let callbacks = [],
val = '',
status = 'pending';
// 2 将then方法绑定到新建的对象上
// 6 当执行then 的时候,判断状态如果状态是fulfilled 表示 promise的异步完成。
this.then = function(callback){
// 7. 如果是pending状态就表示 promise中的回调没有完成,
if(status === 'pending'){
// 8. 将所有回调方法,加入回调数组。 就是then().then() 里面的方法。
callbacks.push(callback)
}
callback(val) //7. 如果是fulfilled 就直接执行then的回调
/*return 这个实例。 注意每次return的实例是不是一样。 这边有个问题,就是如果每次返
的实例不一样,那怎么获取callbacks 我猜想是使用了闭包实现的。 哪位大神知道可以告诉 下
*/
return this
}
// 4.resolve是传入方法的回调,当异步执行完成后就会调用resolve这个方法
function resolve(val){
// 5. 将状态改为成功,表示promise传入的方法里面的异步方法执行完成,这里面用了回调来实现
status = 'fulfilled' // 将状态改为成功
// 为啥要用setTimeOut 是了防止 then() 里面的方法比resolve 先执行,所以将她放入异步事件队列中
setTimeOut(funtion(){
callbacks.forEach(item=>{
// 如果没有返回值就返回上次的值,如果有就返回返回值
item(val)===undefined?val:item(val)
})
},0)
}
// 3 执行传入的方法
fn(resolve)
}
// 1. new 一个新对象
let a = new Promise((resolve)=>{
setTimeOut(function(){
resoleve('promise')
},0)
})
上面就是一个简单的promise,还有几个问题
- 就是在.then() 里面放一个异步函数怎么办
- 没有实现reject