实现一个简易的promise
2024-10-08 02:18:18
//promise里面只有三个状态,且三个状态的转换形式有两种
//由pending转换为fulfilled,由pending转换为rejected //Promise的构造函数参数是一个函数,函数的参数分别为resolve和reject,两者也均为一个函数
//then中是实际要执行的函数,将传递进来的值传给resolve和reject对应的参数
const PENDING = 'PENDING'
const FULFILLED = 'FULFILLED'
const REJECTED = 'REJECTED'
class YPromise {
constructor(cb) {
this.state = PENDING;
this.value = null;
//承诺完成的回调列表
this.fulfilledCbs = [];
//承诺被拒绝的回调列表
this.rejectedCbs = []; let resolve = data => {
setTimeout(() => {
if (this.state !== PENDING) return;
//更改状态
this.state = FULFILLED;
this.value = data;
this.fulfilledCbs.forEach(c => {
this.value = c(this.value);
}) }, 0); }
let reject = reason => {
setTimeout(() => {
if (this.state !== PENDING) return;
this.state = REJECTED;
this.reason = reason;
this.rejectedCbs.forEach(c => {
this.reason = c(this.reason);
}) }, 0);
}
cb(resolve, reject);
};
then(onFulfilled, onRejected) {
if (typeof onFulfilled === 'function') {
this.fulfilledCbs.push(onFulfilled);
}
if (typeof onRejected === 'function') {
this.rejectedCbs.push(onRejected);
}
return this;//返回整个构造函数可以继续调用then方法
}
} let promise = new YPromise((resolve, reject) => {
if (4 > 1) {
resolve('hi');
} else {
reject(4大于1')
}
}) fulfilledCbs = [data => data + 'world']
promise.then(data => {
return data + ' world';
}).then(data => {
return data + '!';
}).then(data => {
console.log(data);
})
最新文章
- Npoi导出Excel 实战篇(Webform)
- linux命令详解之挂载光驱的方法
- Linux下Mysql安装
- Opencv加载和显示图片
- DP编辑距离
- CAS单点登录配置[3]:服务器端配置
- ACM2096_小明A+B
- nodejs 简单http 文件上传demo
- linux命令行常用快捷键
- x0vncserver Fatal server error: no screens found
- Android 开发之错误整理java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE.
- 浅谈MVC异常处理
- vmware安装FreeBSD8.3全攻略【教程】
- Arcgis Engine axMapControl1.get_layer(index)中index意义
- T SQL 将一列多行数据合并为一行
- tomcat 的acceptCount、acceptorThreadCount、maxConnections、maxThreads 如何确定
- SharePoint Framework 企业向导(十)
- .net core中Quartz的使用
- 'Project Name' was compiled with optimization
- python 冒泡排序的总结