手写promise进阶版本
Posted wuconghui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写promise进阶版本相关的知识,希望对你有一定的参考价值。
promise/A+规范:
术语:
1、promise是一个对象或者函数,该对象或者函数有一个then方法
2、thenable是一个函数或者对象,用来定义then方法
3、value是promise成功时的状态值
4、reason是promise失败时的状态值
要求:一、二
一、
1、三种状态 :pending | fulfilled(resolved) | rejected
2、rejected当处于pending状态的时候,可以转移到fulfilled(resolved)或者rejected状态
3、当处于fulfilled(resolved)状态或者rejected状态的时候,就不可变。
二、
1、一个promise必须有一个then方法,then方法接受两个参数并且必须返回一个promise
// onFulfilled 用来接收promise成功的值 // onRejected 用来接收promise失败的原因 promise1=promise.then(onFulfilled, onRejected);
三、
简单的写一下promise的基本用法:
var promise = new Promise((resolve,reject)=> let a =1;b=2 if(a<b) resolve(a) else reject(b) ) promise.then(function(value) console.log(value) ,function(error) console.log(error) )
接着来实现promise的过程,不多说直接贴代码
function myPromise(constructor) let self=this; self.status="pending" //定义状态改变前的初始状态 self.value=undefined;//定义状态为resolved的时候的状态 self.reason=undefined;//定义状态为rejected的时候的状态 function resolve(value) //两个==="pending",保证了状态的改变是不可逆的 if(self.status==="pending") self.value=value; self.status="resolved"; function reject(reason) //两个==="pending",保证了状态的改变是不可逆的 if(self.status==="pending") self.reason=reason; self.status="rejected"; //捕获构造异常 try constructor(resolve,reject); catch(e) reject(e);
同时,需要在myPromise
的原型上定义链式调用的then
方法:
myPromise.prototype.then=function(onFullfilled,onRejected) let self=this; switch(self.status) case "resolved": onFullfilled(self.value); break; case "rejected": onRejected(self.reason); break; default:
那么我们来测试一下结果:
var p=new myPromise(function(resolve,reject)resolve(1)); p.then(function(x)console.log(x)) //输出1
今天就写个进阶版的promise 喜欢更高难度的可以参考链接让我们共同进步吧
引荐链接 :实现一个完美符合Promise/A+规范的Promise
以上是关于手写promise进阶版本的主要内容,如果未能解决你的问题,请参考以下文章