手把手教你手写Promise代码
需积分: 5 196 浏览量
更新于2024-11-07
收藏 513B ZIP 举报
资源摘要信息:"JS代码-Promise 手写"
知识点:
Promise是JavaScript中处理异步操作的一种机制,是ES6引入的一种新的原始对象。Promise允许你将异步操作表示为一个序列,并按照代码的执行顺序来处理异步结果。Promise有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。状态的转换是单向的,一旦从pending转换到fulfilled或rejected,状态就固定了,无法再改变。
手写Promise是JS学习中的一个高级话题,它可以帮助我们更加深入理解Promise的工作机制。下面,我将详细介绍Promise的内部实现原理以及如何手写一个简单的Promise。
首先,Promise构造函数接收一个执行器(executor)作为参数,执行器函数有两个参数,分别是resolve和reject函数。这两个函数都是Promise提供的内置函数,用于改变Promise的状态。
Promise有几个重要的方法:
- then方法:接收两个参数,分别是Promise状态变为fulfilled和rejected时的回调函数。then方法会返回一个Promise对象,所以可以链式调用。
- catch方法:它是then方法的语法糖,接收一个参数,即Promise状态变为rejected时的回调函数。
- finally方法:无论Promise状态是fulfilled还是rejected,finally方法都会被执行。finally方法可以接收一个回调函数作为参数,这个回调函数没有参数。
下面是一个手写的Promise示例代码:
```javascript
// 手写Promise
class MyPromise {
// Promise状态
state = 'pending'; // 初始状态
value = undefined; // 成功时的值
reason = undefined; // 失败时的原因
onFulfilledCallbacks = []; // 成功时的回调
onRejectedCallbacks = []; // 失败时的回调
constructor(executor) {
const resolve = (value) => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
this.onFulfilledCallbacks.forEach((fn) => fn(this.value));
}
};
const reject = (reason) => {
if (this.state === 'pending') {
this.state = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach((fn) => fn(this.reason));
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(onFulfilled, onRejected) {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (value) => value;
onRejected = typeof onRejected === 'function' ? onRejected : (reason) => { throw reason; };
const promise2 = new MyPromise((resolve, reject) => {
if (this.state === 'fulfilled') {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else if (this.state === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else if (this.state === 'pending') {
this.onFulfilledCallbacks.push((value) => {
setTimeout(() => {
try {
const x = onFulfilled(value);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.onRejectedCallbacks.push((reason) => {
setTimeout(() => {
try {
const x = onRejected(reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise2;
}
resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise'));
}
let called;
if ((typeof x === 'object' && x != null) || typeof x === 'function') {
try {
let then = x.then;
if (typeof then === 'function') {
then.call(x, y => {
if (called) return;
called = true;
this.resolvePromise(promise2, y, resolve, reject);
}, r => {
if (called) return;
called = true;
reject(r);
});
} else {
resolve(x);
}
} catch (error) {
if (called) return;
called = true;
reject(error);
}
} else {
resolve(x);
}
}
}
module.exports = MyPromise;
```
以上代码实现了一个基本的Promise,包括状态管理和then方法。需要注意的是,这个实现非常简化,没有处理一些复杂的边缘情况,也没有实现catch和finally方法。在实际开发中,我们会使用JavaScript内置的Promise,除非有特殊需要,一般不需要自己实现Promise。
2021-07-16 上传
2021-07-16 上传
2021-07-16 上传
2021-07-16 上传
2021-07-16 上传
2021-07-16 上传
2021-07-16 上传
2024-11-26 上传
weixin_38642897
- 粉丝: 3
- 资源: 895
最新资源
- JHU荣誉单变量微积分课程教案介绍
- Naruto爱好者必备CLI测试应用
- Android应用显示Ignaz-Taschner-Gymnasium取消课程概览
- ASP学生信息档案管理系统毕业设计及完整源码
- Java商城源码解析:酒店管理系统快速开发指南
- 构建可解析文本框:.NET 3.5中实现文本解析与验证
- Java语言打造任天堂红白机模拟器—nes4j解析
- 基于Hadoop和Hive的网络流量分析工具介绍
- Unity实现帝国象棋:从游戏到复刻
- WordPress文档嵌入插件:无需浏览器插件即可上传和显示文档
- Android开源项目精选:优秀项目篇
- 黑色设计商务酷站模板 - 网站构建新选择
- Rollup插件去除JS文件横幅:横扫许可证头
- AngularDart中Hammock服务的使用与REST API集成
- 开源AVR编程器:高效、低成本的微控制器编程解决方案
- Anya Keller 图片组合的开发部署记录