当前位置: 首页 > news >正文

赣州网站建设开发网站模块建设方案

赣州网站建设开发,网站模块建设方案,网页截图快捷键ctrl加什么,自建站文章目录 前言一、前置知识二、实现基本功能二、实现链式调用三、实现Promise.all四、实现Promise.race总结 前言 关于动机#xff0c;无论是在工作还是面试中#xff0c;都会遇到Promise的相关使用和原理#xff0c;手写Promise也有助于学习设计模式以及代码设计。 本文主… 文章目录 前言一、前置知识二、实现基本功能二、实现链式调用三、实现Promise.all四、实现Promise.race总结 前言 关于动机无论是在工作还是面试中都会遇到Promise的相关使用和原理手写Promise也有助于学习设计模式以及代码设计。 本文主要介绍了如何使用自己的代码去实现Promise的一些功能。 以下是本篇文章正文内容 一、前置知识 手写之前需要知道promise有哪些基本特性 1、promise有三种状态pending、fulfilled、rejected。 2、promise的默认状态是pending状态流转有两种pending—fulfilled、pending—rejected。 3、实例化Promise时可以接收一个函数作为参数这个函数有两个参数分别是resolve、reject方法用于改变实例状态。并能够执行下一个then中的回调函数。 4、then方法中接收两个函数作为参数第一个函数相当于执行上一个 promise 中执行 resolve 后对应的回调第二个函数相当于执行上一个 promise 中执行 reject 后对应的回调。 // 1. 实例化 Promise 时 // 可以接收一个函数作为参数这个函数可以接收到 resolve 和 reject 两个实例方法 // 用于更改当前实例的状态并把它们接收到的参数传递给下一个 then 对应的参数中new Promise((resolve, reject) {// resolve 和 reject 可以都执行但都执行的意义不大因为 promise 状态发生更改后就不能在被更改resolve(ok);// reject(err);}).then((value) {console.log(resolve callback , value); // 若执行 resolve则 value ok}, (reason) {console.log(reject callback , reason); // 若执行 reject则 value err});5、then操作后会返回一个新的Promise且支持链式调用。 let promise new Promise((resolve,reject) {resolve(11) }) const a new Promise((resolve,reject) {reject(ok) }) promise.then(res {console.log(res)return a }).then(res console.log(res))6、Promise.all以数组的形式接收多个Promise当所有Promise执行完成且状态都为fulfilled时返回执行成功的结果有一个失败则返回失败的结果。 7、Promise.race以数组的形式接收多个Promise只要有一个Promise先执行成功无论什么状态都返回这个结果给到下一个then中对应的回调。 二、实现基本功能 1、 new 操作resolve、reject方法then方法 // 定义三种状态 const PENDING PENDING; const FULFILLED FULFILLED; const REJECTED REJECTED;class Promise {constructor(executor) {// 1、默认状态 - PENDINGthis.status PENDING;// 2、内部维护的变量值this.value undefined;this.reason undefined;try {executor(this.resolve.bind(this), this.reject.bind(this)) // 实例化传进来的函数会立即执行} catch(err) {this.reject(err)}}resolve(value) {if (this.status PENDING) {this.value value;this.status FULFILLED;}}reject(reason) {if (this.status PENDING) {this.reason reason;this.status REJECTED;}}then(onFulfilled, onRejected) {if (onFulfilled this.status FULFILLED) {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)}if (onRejected this.status REJECTED) {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)} } }通过以下代码自测 new Promise((resolve,reject) {resolve(1) }).then(res {console.log(res) // 1 })2、考虑异步的情况。 以上代码都是同步的Promise实例化时传入了异步函数如setTimeout在setTimeout中resolve在下一个then的回调函数获取异步函数的状态呢 我们可以使用回调队列缓存起来等待执行 // 定义三种状态 const PENDING PENDING; const FULFILLED FULFILLED; const REJECTED REJECTED;class Promise {constructor(executor) {// 1、默认状态 - PENDINGthis.status PENDING;// 2、内部维护的变量值this.value undefined;this.reason undefined;this.onResolveCallBack [];// 缓存 onResolve this.onRejectCallBack [];// 缓存 onReject try {executor(this.resolve.bind(this), this.reject.bind(this)) // 实例化传进来的函数会立即执行} catch(err) {this.reject(err)}}resolve(value) {if (this.status PENDING) {this.value value;this.status FULFILLED;// 遍历调用 onResolveCallBackthis.onResolveCallBack.forEach(fn fn());}}reject(reason) {if (this.status PENDING) {this.reason reason;this.status REJECTED;this.onResolveCallBack.forEach(fn fn());}}then(onFulfilled, onRejected) {if (onFulfilled this.status FULFILLED) {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)}if (onRejected this.status REJECTED) {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)}// 当前 promise 状态为 pending把当前的 onResolve onReject 缓存起来if (this.status PENDING) {this.onResolveCallBack.push(() {onResolve(this.value);}); this.onRejectCallBack.push(() {onReject(this.value);});} } }用以下代码测试通过 let p new MyPromise((resolve, reject) {setTimeout((){resolve(1);},1000);}).then(value {console.log(then resolve , value);}, reason {console.log(then reject , reason);}); // then resolve 1二、实现链式调用 then(onFulfilled, onRejected) {return new Promise((resolve, reject) { // 支持链式调用if (onFulfilled this.status FULFILLED) {let res onFulfilled(this.value)resolve(res);}if (onRejected this.status REJECTED) {let res onRejected(this.reason)resolve(res);}if (this.status PENDING) {this.onResolvedCallbacks.push(() {let res onFulfilled(this.value)resolve(res);})this.onRejectedCallbacks.push(() {let res onRejected(this.reason)resolve(res);})}}) }测试用例 let promise new Promise((resolve,reject) {resolve(1) }) promise.then(res {return 2 // 返回普通对象 }).then(res console.log(res)) // 2如果在then中返回的是普通对象上述代码能满足如果返回的是一个Promise则还需要补充 then(onFulfilled, onRejected) {return new Promise((resolve, reject) { // 支持链式调用if (onFulfilled this.status FULFILLED) {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)}if (onRejected this.status REJECTED) {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)}if (this.status PENDING) {this.onResolvedCallbacks.push(() {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)})this.onRejectedCallbacks.push(() {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)})}})}resolvePromise(res, resolve, reject) {if(res instanceof Promise) { // 对then中返回Promise做处理res.then(resolve, reject)} else{// 普通值resolve(res)}}测试用例 let promise new Promise((resolve,reject) {resolve(11) }) const a new Promise((resolve,reject) {reject(ok) }) promise.then(res {return a; }).then(res console.log(res)) // ok三、实现Promise.all 由上述前置知识可知Promise.all是全部成功才返回成功的结果有一个失败就返回失败的结果 Promise.all function(arr) {return new Promise((resolve, reject) {if (!Array.isArray(arr)) {return reject(参数必须为数组);}let successNum 0; // 成功的Promise条数let resultArray [];let totalNum arr.length; // 总Promise数量let isFail false;arr.forEach(item {item.then(res {successNum;resultArray.push(res);if (successNum totalNum) { // 说明是全部成功return resolve(resultArray)}}, err {if (!isFail) reject(err)isFail true;})}); }) }测试用例 function wait500(input) {return new Promise((resolve, reject) {setTimeout(() {resolve(500)}, 500)}) } function wait1000(input) {return new Promise((resolve, reject) {setTimeout(() {resolve(1000)}, 1000)}) } // 全部执行完成之后回调 Promise.all([wait1000(), wait500()]).then(result {console.log(all end, result) }, err {console.log(fafaf, err) }) // all end [500, 1000]四、实现Promise.race 由上述前置知识可知Promise.race是有一个promise先执行成功无论什么状态都返回这个结果 Promise.race function(arr) {return new Promise((resolve, reject) {if (!Array.isArray(arr)) {return reject(参数必须为数组);}arr.forEach(item {item.then(res {return resolve(res); // 状态不可逆只要其中一个Promise转变了状态后续状态就不会发生改变}, err {reject(err);})}); })}测试用例 function wait500(input) {return new Promise((resolve, reject) {setTimeout(() {resolve(500)}, 500)}) } function wait1000(input) {return new Promise((resolve, reject) {setTimeout(() {resolve(1000)}, 1000)}) } Promise.race([wait1000(), wait500()]).then(result {console.log(all end, result) }, err {console.log(fafaf, err) }) // 打印出all end 500总结 总的代码 const PENDING PENDING; const FULFILLED FULFILLED; const REJECTED REJECTED;class Promise {constructor(executor) {// 1、默认状态 - PENDINGthis.status PENDING;// 2、内部维护的变量值this.value undefined;this.reason undefined;// 存放回调this.onResolvedCallbacks [];this.onRejectedCallbacks [];try {executor(this.resolve.bind(this), this.reject.bind(this))} catch(err) {this.reject(err)}}resolve(value) {if (this.status PENDING) {this.value value;this.status FULFILLED;this.onResolvedCallbacks.forEach(fn fn())}}reject(reason) {if (this.status PENDING) {this.reason reason;this.status REJECTED;this.onRejectedCallbacks.forEach(fn fn())}}then(onFulfilled, onRejected) {return new Promise((resolve, reject) { // 支持链式调用if (onFulfilled this.status FULFILLED) {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)}if (onRejected this.status REJECTED) {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)}if (this.status PENDING) {this.onResolvedCallbacks.push(() {let res onFulfilled(this.value)this.resolvePromise(res, resolve, reject)})this.onRejectedCallbacks.push(() {let res onRejected(this.reason)this.resolvePromise(res, resolve, reject)})}})}resolvePromise(res, resolve, reject) {if(res instanceof Promise) {res.then(resolve, reject)} else{// 普通值resolve(res)}} } // 全部成功才返回成功的结果有一个失败就返回失败的结果 Promise.all function(arr) {return new Promise((resolve, reject) {if (!Array.isArray(arr)) {return reject(参数必须为数组);}let successNum 0;let resultArray [];let totalNum arr.length;let isFail false;arr.forEach(item {item.then(res {successNum;resultArray.push(res);if (successNum totalNum) {return resolve(resultArray)}}, err {if (!isFail) reject(err)isFail true;})}); }) }// 某个promise先完成 Promise.race function(arr) {return new Promise((resolve, reject) {if (!Array.isArray(arr)) {return reject(参数必须为数组);}arr.forEach(item {item.then(res {return resolve(res);}, err {reject(err);})}); })}
http://www.hkea.cn/news/14272889/

相关文章:

  • 做商城网站技术要点花的网站建设规划书
  • 做视频资源网站有哪些自建app免费制作平台
  • 成都模板网站建设平罗县住房和城乡建设局网站
  • 新网站备案广告设计与制作专业分析
  • 想自己做个网站中国建设部网站失信名单
  • 小程序 网站建设 app 开发建设工程培训
  • 网站页面打开速度企业信息查询系统官网北京
  • 长沙网站设计公司广东新闻频道直播在线观看高清
  • 包年seo和整站优化华为品牌策划方案
  • 做营销网站设计宁波网站推广方式
  • 网站如何运营维护ytwzjs烟台网站建设
  • 湖北企业建站系统信息衡水企业网站设计
  • 网站开发计划书封面设计做网站北京公司
  • 怎么做盗版视频网站业务推广网站
  • 自己做的网站如何上线外贸网站logo
  • 沈阳网站制作联系方式百度怎么制作网页
  • 做微商网站需要哪些宁波环网建设
  • 海珠建网站公网站开发昆山
  • 南京手机网站开发响应式做的好的网站
  • 徐州网站建设新闻汽车网站更新怎么做
  • 学校网站平台建设方案芭乐站长统计 网站统计
  • 学校建设网站前的市场分析能源网站建设方案
  • 罗湖医院网站建设福田网站设计哪家好
  • 雄县哪做网站可信网站认证有用吗
  • 江苏建设监理协会网站wordpress安装大淘客
  • 麻章手机网站建设公司购买的域名是永久的吗
  • 建设银行官网首页网站公告影视自助建站官网
  • 医院网站建设案例主流的net快速开发框架
  • 济南网站建设公司排名app 网站 比较
  • 整套网站建设视频教程wordpress公众号获取注册码