栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

请用js实现一个promise的方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

请用js实现一个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.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

大厂专供版

const PENDING = "pending";const FULFILLED = "fulfilled";const REJECTED = "rejected";function Promise(excutor) {    let that = this; // 缓存当前promise实例对象    that.status = PENDING; // 初始状态    that.value = undefined; // fulfilled状态时 返回的信息    that.reason = undefined; // rejected状态时 拒绝的原因    that.onFulfilledCallbacks = []; // 存储fulfilled状态对应的onFulfilled函数    that.onRejectedCallbacks = []; // 存储rejected状态对应的onRejected函数    function resolve(value) { // value成功态时接收的终值        if(value instanceof Promise) { return value.then(resolve, reject);        }        // 实践中要确保 onFulfilled 和 onRejected 方法异步执行,且应该在 then 方法被调用的那一轮事件循环之后的新执行栈中执行。        setTimeout(() => { // 调用resolve 回调对应onFulfilled函数 if (that.status === PENDING) {     // 只能由pending状态 => fulfilled状态 (避免调用多次resolve reject)     that.status = FULFILLED;     that.value = value;     that.onFulfilledCallbacks.forEach(cb => cb(that.value)); }        });    }    function reject(reason) { // reason失败态时接收的拒因        setTimeout(() => { // 调用reject 回调对应onRejected函数 if (that.status === PENDING) {     // 只能由pending状态 => rejected状态 (避免调用多次resolve reject)     that.status = REJECTED;     that.reason = reason;     that.onRejectedCallbacks.forEach(cb => cb(that.reason)); }        });    }    // 捕获在excutor执行器中抛出的异常    // new Promise((resolve, reject) => {    //     throw new Error('error in excutor')    // })    try {        excutor(resolve, reject);    } catch (e) {        reject(e);    }}Promise.prototype.then = function(onFulfilled, onRejected) {    const that = this;    let newPromise;    // 处理参数默认值 保证参数后续能够继续执行    onFulfilled =        typeof onFulfilled === "function" ? onFulfilled : value => value;    onRejected =        typeof onRejected === "function" ? onRejected : reason => { throw reason;        };    if (that.status === FULFILLED) { // 成功态        return newPromise = new Promise((resolve, reject) => { setTimeout(() => {     try{         let x = onFulfilled(that.value);         resolvePromise(newPromise, x, resolve, reject); // 新的promise resolve 上一个onFulfilled的返回值     } catch(e) {         reject(e); // 捕获前面onFulfilled中抛出的异常 then(onFulfilled, onRejected);     } });        })    }    if (that.status === REJECTED) { // 失败态        return newPromise = new Promise((resolve, reject) => { setTimeout(() => {     try {         let x = onRejected(that.reason);         resolvePromise(newPromise, x, resolve, reject);     } catch(e) {         reject(e);     } });        });    }    if (that.status === PENDING) { // 等待态        // 当异步调用resolve/rejected时 将onFulfilled/onRejected收集暂存到集合中        return newPromise = new Promise((resolve, reject) => { that.onFulfilledCallbacks.push((value) => {     try {         let x = onFulfilled(value);         resolvePromise(newPromise, x, resolve, reject);     } catch(e) {         reject(e);     } }); that.onRejectedCallbacks.push((reason) => {     try {         let x = onRejected(reason);         resolvePromise(newPromise, x, resolve, reject);     } catch(e) {         reject(e);     } });        });    }};
  • 参考自https://juejin.im/post/5c9c3989e51d454e3a3902b6
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376087.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号