最近看到了一个有趣的Promise的方法,这里记录下来

 <script>
class MyPromise {
constructor(executor) {
// 初始化state赋值为pending
this.state = "pending";
// 定义成功的 值
this.value = undefined;
//定义失败的 原因
this.reason = undefined;
//定义成功存起来的数组
this.onResolvedCallbacks = [];
//定义失败存起来的数组
this.onRejectedCallbacks = [];
let resolve = (value) => {
// state改变,resolve调用就会失败
if (this.state === "pending") {
this.value = value;
//resolve调用后,state转为fulfilled
this.state = "fulfilled";
// 一旦resolve执行,调用成功数组的函数
this.onResolvedCallbacks.forEach(function (fn) {
return fn(value);
});
//也可以使用es6语法 简写
//this.onResolvedCallbacks.forEach(fn => fn(value));
}
};
let reject = (reason) => {
// state改变,reject调用就会失败
if (this.state === "pending") {
this.reason = reason;
// reject调用后,state转为失败状态
this.state = "rejected";
// 一旦reject执行,调用失败数组的函数
this.onRejectedCallbacks.forEach(fn => fn(reason)); //简写
}
}; // new MyPromise后的实例具有状态, 默认状态是等待,当执行器调用resolve后, 实例状态为成功状态;当执行器调用reject后,实例状态为失败状态
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
} // then中有两个参数 ,把第一个参数叫做then的成功回调,把第二个参数叫做then的失败回调,这两个参数也都是函数,当执行器调用resolve后,then中第一个参数函数会执行,当执行器调用reject后,then中第二个参数函数会执行
then(onFulfilled, onRejected) {
// 状态为fulfilled,执行onFulfilled,传入成功的值
if (this.state === "fulfilled") {
onFulfilled(this.value);
}
// 状态为rejected,执行onRejected,传入失败的原因
if (this.state === "rejected") {
onRejected(this.reason);
}
// 状态为pending时
if (this.state === "pending") {
// onFulfilled传入到成功数组
this.onResolvedCallbacks.push(onFulfilled);
// onRejected传入到失败数组
this.onRejectedCallbacks.push(onRejected);
}
}
}
//当new MyPromise实例 会立即调用constructor(executor)
let p = new MyPromise((resolve, reject) => {
console.log("开始");
setTimeout(function () {
resolve("我成功了");
}, 2000);
}); p.then(
(resolve) => {
console.log("success:" + resolve);
},
(reject) => {
console.log("error:" + reject);
}
);
console.log("结束");
</script>

转载于:https://blog.csdn.net/l_XIANA/article/details/110141804?utm_medium=distribute.pc_category.none-task-blog-hot-9.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-9.nonecase

最新文章

  1. Python学习二(生成器和八皇后算法)
  2. Jquery 操作IFrame
  3. 象写程序一样写博客:搭建基于github的博客
  4. Ajax随笔
  5. vs-ps combination error
  6. js 中文排序
  7. IKAnalyzer原理分析
  8. VBS 读取文本文件特殊字符前如逗号的值并赋值给变量
  9. matlab实现可调节占空比的方波
  10. 阿里云API网关(6)用户指南(开放 API )
  11. Gradle 1.12 翻译——第十八章. 日志
  12. 关于jasperreport对应java打印机的解决方案
  13. read()和write()
  14. 环境与工具1:微信群刷屏 | itchat
  15. Jenkins的构建编号和一个有趣的bug
  16. python 函数定义及调用
  17. mysql分区方案的研究
  18. String类中的equals()方法:
  19. weixin.com的whois信息变更为腾讯了 是准备替换weixin.qq.com吗?
  20. idea 与springboot 快捷键

热门文章

  1. CSS —— css属性
  2. Azure Terraform(一)入门简介
  3. 常见编译器EOP
  4. vue watch监听不到对象,探究 watch 原理
  5. 将从数据库查询出来的带有父子结构的list转换成treeList结构
  6. [leetcode]669. Trim a Binary Search Tree寻找范围内的二叉搜索树
  7. 设置Safari禁止访问某个网站
  8. 如何解决 ajax跨域被阻止 CORS 头缺少 &#39;Access-Control-Allow-Origin&#39;的问题?
  9. ORB-SLAM3 细读单目初始化过程(上)
  10. kafka 0.8+spark offset 提交至mysql