手写Promise

228 阅读2分钟

蛋老师说过,如果想要自己的技术有提升就需要学会手写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)
})




image-20211223152310016.png

上面就是一个简单的promise,还有几个问题

  1. 就是在.then() 里面放一个异步函数怎么办
  2. 没有实现reject