中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

方案 網(wǎng)站建設(shè)快手seo軟件下載

方案 網(wǎng)站建設(shè),快手seo軟件下載,國家電網(wǎng)網(wǎng)站開發(fā)圖片素材,遼寧建設(shè)工程信息網(wǎng)聯(lián)合體怎么報(bào)名筆記分享 在現(xiàn)代JavaScript開發(fā)中,異步編程是不可避免的一部分。為了更好地處理異步操作,ES6引入了Promise。Promise使得異步代碼更具可讀性和可維護(hù)性。通過手寫一個完整的Promise實(shí)現(xiàn),可以幫助你更深入地理解其工作原理。本文將詳細(xì)介紹Pr…

筆記+分享

在現(xiàn)代JavaScript開發(fā)中,異步編程是不可避免的一部分。為了更好地處理異步操作,ES6引入了Promise。Promise使得異步代碼更具可讀性和可維護(hù)性。通過手寫一個完整的Promise實(shí)現(xiàn),可以幫助你更深入地理解其工作原理。本文將詳細(xì)介紹Promise的概念、用法及其在實(shí)際開發(fā)中的應(yīng)用,并提供一個手寫的Promise實(shí)現(xiàn)。

什么是Promise?

Promise是JavaScript中的一種對象,用于表示一個異步操作的最終完成(或失敗)及其結(jié)果值。它有三種狀態(tài):

  1. Pending(待定):初始狀態(tài),既沒有被兌現(xiàn),也沒有被拒絕。
  2. Fulfilled(已兌現(xiàn)):操作成功完成,并返回一個值。
  3. Rejected(已拒絕):操作失敗,并返回一個原因。

手寫Promise實(shí)現(xiàn)

我們將通過構(gòu)建一個簡化版的Promise實(shí)現(xiàn)來更好地理解其工作原理。

class MyPromise {constructor(executor) {this.state = 'pending'; // 初始狀態(tài)this.value = undefined; // 成功時的值this.reason = undefined; // 失敗時的原因this.onFulfilledCallbacks = []; // 成功的回調(diào)函數(shù)數(shù)組this.onRejectedCallbacks = []; // 失敗的回調(diào)函數(shù)數(shù)組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);}
}

關(guān)鍵點(diǎn)解釋

  1. 狀態(tài)管理:Promise有三種狀態(tài):pendingfulfilledrejected。通過state變量來管理當(dāng)前Promise的狀態(tài)。
  2. 回調(diào)隊(duì)列:使用兩個數(shù)組onFulfilledCallbacksonRejectedCallbacks來存儲在pending狀態(tài)時注冊的回調(diào)函數(shù)。
  3. resolve和rejectresolve函數(shù)將Promise狀態(tài)從pending變?yōu)?code>fulfilled,并執(zhí)行所有成功回調(diào);reject函數(shù)將Promise狀態(tài)從pending變?yōu)?code>rejected,并執(zhí)行所有失敗回調(diào)。
  4. then方法then方法返回一個新的Promise,并根據(jù)當(dāng)前Promise的狀態(tài)決定如何處理回調(diào)函數(shù)。
  5. resolvePromise函數(shù):這個函數(shù)用來處理then方法中的鏈?zhǔn)秸{(diào)用,確保Promise的規(guī)范執(zhí)行,防止循環(huán)引用等問題。

用法示例

const p1 = new MyPromise((resolve, reject) => {setTimeout(() => {resolve('成功');}, 1000);
});p1.then(value => {console.log(value); // 輸出 "成功"return new MyPromise((resolve, reject) => {setTimeout(() => {resolve('鏈?zhǔn)秸{(diào)用成功');}, 1000);});
}).then(value => {console.log(value); // 輸出 "鏈?zhǔn)秸{(diào)用成功"
}).catch(error => {console.error(error);
});

通過這個手寫的Promise實(shí)現(xiàn),你可以更好地理解Promise的內(nèi)部工作機(jī)制,并在實(shí)際開發(fā)中靈活運(yùn)用Promise來處理異步操作。希望這篇博客能幫助你深入理解JavaScript中的Promise。

http://www.risenshineclean.com/news/33123.html

相關(guān)文章:

  • 織夢網(wǎng)站問題班級優(yōu)化大師怎么加入班級
  • 電商加盟上海搜索引擎關(guān)鍵詞優(yōu)化
  • 做美食的網(wǎng)站有那一些韓國網(wǎng)站
  • ip動態(tài)地址做網(wǎng)站網(wǎng)站seo站長工具
  • 第一家做誘惑的網(wǎng)站廈門seo優(yōu)化
  • 貴州潤鐵祥建設(shè)工程有限公司網(wǎng)站外包公司軟件開發(fā)
  • 杭州江干區(qū)抖音seo哪里有五年級上冊語文優(yōu)化設(shè)計(jì)答案
  • 電子商務(wù)網(wǎng)站的作用seo排名第一的企業(yè)
  • win7iis部署asp.net網(wǎng)站媒體營銷平臺
  • 企業(yè)網(wǎng)站營銷優(yōu)缺點(diǎn)百度推廣平臺
  • 做網(wǎng)站費(fèi)用會計(jì)分錄百度貼吧網(wǎng)頁版登錄入口
  • 視頻網(wǎng)站 如何做seo專業(yè)seo公司
  • 什么網(wǎng)站可以做醫(yī)療設(shè)備的十大少兒編程教育品牌
  • 做家裝的設(shè)計(jì)公司網(wǎng)站seo廣告優(yōu)化
  • 網(wǎng)站模板更換營銷廣告語
  • 改版百度不收錄網(wǎng)站百度游戲中心app
  • 農(nóng)業(yè)信息免費(fèi)發(fā)布平臺合肥網(wǎng)站快速優(yōu)化排名
  • 怎樣用網(wǎng)站做淘寶推廣百度收錄教程
  • 成人用品網(wǎng)站怎么推廣推廣代理登錄頁面
  • 淮安市建設(shè)工程施工圖審查處網(wǎng)站微信營銷推廣公司
  • 免費(fèi)24小時咨詢醫(yī)生網(wǎng)站seo推廣計(jì)劃
  • 家政服務(wù) 技術(shù)支持 東莞網(wǎng)站建設(shè)真正的免費(fèi)建站在這里
  • b2c商城網(wǎng)站百度平臺電話
  • java做網(wǎng)站開發(fā)書seo綜合查詢 站長工具
  • 用凡科做網(wǎng)站的費(fèi)用百度競價(jià)推廣運(yùn)營
  • 數(shù)據(jù)庫支持的網(wǎng)站怎么做北京疫情最新情況
  • 金壇做網(wǎng)站鏈接交易網(wǎng)
  • 淘寶放單網(wǎng)站怎么做推客平臺
  • 如何做網(wǎng)站seo優(yōu)化惠州seo報(bào)價(jià)
  • 哪些網(wǎng)站可以做外部錨文本seo營銷推廣全程實(shí)例