博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写一个Promise
阅读量:5929 次
发布时间:2019-06-19

本文共 1897 字,大约阅读时间需要 6 分钟。

相信很多人面试的时候都被问过:

你能手写一个Promise么?

肯定可以呀,手写没问题,不要求脚写就ok。

不多逼逼,show you the code。

function Promise(executor) {  this._status = "Pending";  this._subPromiseResolves = [];  this._subPromiseRejects = [];  this._value = undefined;  let resolve = (val) => {    if(this._status !=== "Pending") return    this._status = "Resolved";    this._value = val;    this._subPromiseResolves.forEach((resolve) => {      resolve(val);    })  }  let reject = (reason) => {    if(this._status !=== "Pending") return    this._status = "Rejected";    this._value = reason;    this._subPromiseRejects.forEach((reject) => {      reject(reason);    })  }  executor(resolve, reject);}Promise.resolve = (val) => {  return new Promise((resolve) => {    resolve(val);  })}Promise.reject = (val) => {  return new Promise((resolve, reject) => {    reject(val);  })}Promise.prototype.then = function(onResolved, onRejected) {  let newPromise;  switch(this._status) {    case "Resolved":       if(onResolved) {        newPromise = Promise.resolve(onResolved(this._value));      }else {        //值穿透        newPromise = Promise.resolve(this._value);      }      break;    case "Rejected":      if(onRejected) {        newPromise = Promise.resolve(onRejected(this._value));      }else {        //错误往下冒泡        newPromise = Promise.reject(this._value);      }      break;    case "Pending":      newPromise = new Promise((resolve, reject) => {        //给前一个Promise存一个能触发回调并改变状态的函数        this._subPromiseResolves.push(function(val){          resolve(onResolved(val));        });        this._subPromiseRejects.push(function(val){          reject(onRejected(val));        });      })  }  return newPromise}Promise.prototype.catch = function(onRejected){  return this.then(null, onRejected);}复制代码

ps:这段代码实现了Promise的thencatch、链式写法...等功能,还有挺多的功能没加上,不过相信看懂这段代码的大家都有能力为它添加更多的功能。

**祝大家新年快乐**

转载于:https://juejin.im/post/5c54fc7b5188256283252eab

你可能感兴趣的文章
tar 解压缩命令
查看>>
编译安装详解和rpm和yum
查看>>
Javascript异步编程之三Promise: 像堆积木一样组织你的异步流程
查看>>
高精度阶乘计算(蓝桥杯)
查看>>
Codeforces Round #352 (Div. 2)
查看>>
poj 3345(树形dp)
查看>>
VS 2010测试解读2-给测试用例做标签
查看>>
删除文件夹(c#)
查看>>
WebSocket ,Socket ,Http差异
查看>>
mysql 常用查询语句记录
查看>>
日志挖掘(logminer)
查看>>
Gym - 100920H 2010-2011 OpenCup IX Onsite, II Yandex Summer School H.Squares 暴力
查看>>
LEMP平台全编译搭建
查看>>
install flash player plugin: linux 11.10 --chrome
查看>>
构造与析构
查看>>
【状压DP】bzoj1087 互不侵犯king
查看>>
mac 安装MySQL
查看>>
面向对象第一单元总结
查看>>
Python lambda函数
查看>>
ASP.net 里怎么对fileUpload控件上传的文件进行管理
查看>>