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

wordpress主题模板视频网站游戏是怎么做的视频网站

wordpress主题模板视频网站,游戏是怎么做的视频网站,手机网站建设哪家优惠,濮阳做网站 汉狮网络笔记分享 在现代JavaScript开发中,异步编程是不可避免的一部分。为了更好地处理异步操作,ES6引入了Promise。Promise使得异步代码更具可读性和可维护性。通过手写一个完整的Promise实现,可以帮助你更深入地理解其工作原理。本文将详细介绍Pr…

笔记+分享

在现代JavaScript开发中,异步编程是不可避免的一部分。为了更好地处理异步操作,ES6引入了Promise。Promise使得异步代码更具可读性和可维护性。通过手写一个完整的Promise实现,可以帮助你更深入地理解其工作原理。本文将详细介绍Promise的概念、用法及其在实际开发中的应用,并提供一个手写的Promise实现。

什么是Promise?

Promise是JavaScript中的一种对象,用于表示一个异步操作的最终完成(或失败)及其结果值。它有三种状态:

  1. Pending(待定):初始状态,既没有被兑现,也没有被拒绝。
  2. Fulfilled(已兑现):操作成功完成,并返回一个值。
  3. Rejected(已拒绝):操作失败,并返回一个原因。

手写Promise实现

我们将通过构建一个简化版的Promise实现来更好地理解其工作原理。

class MyPromise {constructor(executor) {this.state = 'pending'; // 初始状态this.value = undefined; // 成功时的值this.reason = undefined; // 失败时的原因this.onFulfilledCallbacks = []; // 成功的回调函数数组this.onRejectedCallbacks = []; // 失败的回调函数数组const resolve = (value) => {if (this.state === 'pending') {this.state = 'fulfilled';this.value = value;this.onFulfilledCallbacks.forEach(fn => fn());}};const reject = (reason) => {if (this.state === 'pending') {this.state = 'rejected';this.reason = reason;this.onRejectedCallbacks.forEach(fn => fn());}};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 };let promise2 = new MyPromise((resolve, reject) => {if (this.state === 'fulfilled') {setTimeout(() => {try {let x = onFulfilled(this.value);resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);}if (this.state === 'rejected') {setTimeout(() => {try {let x = onRejected(this.reason);resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);}if (this.state === 'pending') {this.onFulfilledCallbacks.push(() => {setTimeout(() => {try {let x = onFulfilled(this.value);resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);});this.onRejectedCallbacks.push(() => {setTimeout(() => {try {let x = onRejected(this.reason);resolvePromise(promise2, x, resolve, reject);} catch (error) {reject(error);}}, 0);});}});return promise2;}catch(onRejected) {return this.then(null, onRejected);}static resolve(value) {return new MyPromise((resolve, reject) => {resolve(value);});}static reject(reason) {return new MyPromise((resolve, reject) => {reject(reason);});}static all(promises) {return new MyPromise((resolve, reject) => {let results = [];let completed = 0;const processResult = (index, value) => {results[index] = value;if (++completed === promises.length) {resolve(results);}};promises.forEach((promise, index) => {MyPromise.resolve(promise).then(value => {processResult(index, value);}, reject);});});}static race(promises) {return new MyPromise((resolve, reject) => {promises.forEach(promise => {MyPromise.resolve(promise).then(resolve, reject);});});}
}function resolvePromise(promise2, x, resolve, reject) {if (promise2 === x) {return reject(new TypeError('Chaining cycle detected for promise'));}let called = false;if (x && (typeof x === 'object' || typeof x === 'function')) {try {let then = x.then;if (typeof then === 'function') {then.call(x, y => {if (called) return;called = true;resolvePromise(promise2, y, resolve, reject);}, reason => {if (called) return;called = true;reject(reason);});} else {resolve(x);}} catch (error) {if (called) return;called = true;reject(error);}} else {resolve(x);}
}

关键点解释

  1. 状态管理:Promise有三种状态:pendingfulfilledrejected。通过state变量来管理当前Promise的状态。
  2. 回调队列:使用两个数组onFulfilledCallbacksonRejectedCallbacks来存储在pending状态时注册的回调函数。
  3. resolve和rejectresolve函数将Promise状态从pending变为fulfilled,并执行所有成功回调;reject函数将Promise状态从pending变为rejected,并执行所有失败回调。
  4. then方法then方法返回一个新的Promise,并根据当前Promise的状态决定如何处理回调函数。
  5. resolvePromise函数:这个函数用来处理then方法中的链式调用,确保Promise的规范执行,防止循环引用等问题。

用法示例

const p1 = new MyPromise((resolve, reject) => {setTimeout(() => {resolve('成功');}, 1000);
});p1.then(value => {console.log(value); // 输出 "成功"return new MyPromise((resolve, reject) => {setTimeout(() => {resolve('链式调用成功');}, 1000);});
}).then(value => {console.log(value); // 输出 "链式调用成功"
}).catch(error => {console.error(error);
});

通过这个手写的Promise实现,你可以更好地理解Promise的内部工作机制,并在实际开发中灵活运用Promise来处理异步操作。希望这篇博客能帮助你深入理解JavaScript中的Promise。

http://www.yayakq.cn/news/445221/

相关文章:

  • 网站建设与管理淘宝建站网站设计
  • 网站开发培训学校网站对招聘网站页面设计做建议
  • 企业网站建设费用 珠海重庆市全面解封
  • 兰州手机网站制作大气网站首页欣赏
  • 网站上怎样做下载文档链接海外酒店网站建设
  • 经网站建设是什么经营范围科技未来网站建设
  • 如何建设移动端网站外国游戏概念设计网站
  • 建设网站的网页设计咖啡网站建设策划书
  • 如何进入谷歌网站数字展厅设成都企业展厅设计公司
  • 深圳国税局网站怎么做票种核定思源黑体可以做网站
  • 网站建设 部署与发布试题华辰合肥企业展厅设计公司
  • 建设网站框架汕头规划建设
  • asp.net 手机网站模板电商运营培训课程网站
  • 外贸网站怎么做会吸引眼球岳阳口碑好的装修公司
  • 做的网站太大第二章 网站建设
  • 免费自己制作网站方法上不了国外网站 怎么做贸易
  • erp网站开发如何给网站加引导页
  • 保护稀有动物网站建设策划书黄石网站建设定做
  • 天网网站建设白山住房与城乡建设局网站
  • 宁波网站建设信息网宝安中心医院入职体检多少钱
  • 省建设厅网站二建考试短视频运营
  • 哪有做婚介网站的油田公司健康企业建设
  • 三木做网站重庆做企业年报在哪个网站做
  • 安阳电话区号关键词排名优化价格
  • 株洲网站建设平台广西玉林建设厅官方网站
  • wordpress设计网站个人网页设计模板html代码
  • 这个网站最近运转怎么样?安全性怎么样? 另外建设银行的网银能在这里存取款吗?六安网页设计
  • 网站域名的后缀广东网站备案审核时间
  • 网站开发工作描述wordpress 自定义 sql
  • 旅游网站开发与建设论文公司flash网站模板