日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

浅谈用原生 JS 模仿个Promise 的实现

發(fā)布時(shí)間:2025/4/16 javascript 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈用原生 JS 模仿个Promise 的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在嘗試寫一個(gè) Promise 的時(shí)候,沒有看任何的開源代碼,我覺得這樣遇到的問題才足夠真實(shí)。

2018-05-15 11:10

目前只能做到這樣:

const Promise = function( callback ) {if(typeof callback !== 'function') {throw new Error(`Promise resolver ${ callback } is not a function`)}const PROMISE_STATUS = '[[PromiseStatus]]';const PROMISE_VALUE = '[[PromiseValue]]';this[PROMISE_STATUS] = 'pending';this[PROMISE_VALUE] = undefined;let resolveFn,rejectFn,isThen,isCatch,finallyFn;Object.defineProperty(this, PROMISE_STATUS, {set: ( newVal ) => {const value = this[ PROMISE_VALUE ];if( newVal === 'fulfilled' && isThen ) {resolveFn && resolveFn( value )}if( newVal === 'rejected' && isCatch ) {rejectFn && rejectFn( value )}finallyFn && finallyFn( value )}});const resolve = ( response ) => {if( isCatch ) return;setTimeout(() => {isThen = true;this[ PROMISE_VALUE ] = response;this[ PROMISE_STATUS ] = 'fulfilled';}, 0)};const reject = ( error ) => {if( isThen ) return;setTimeout(() => {isCatch = true;this[ PROMISE_VALUE ] = error;this[ PROMISE_STATUS ] = 'rejected';}, 0)// const e = new Error( error );// e.stack = '';// e.name = '(in Promise)';// throw e };Promise.prototype.then = function ( callback ) {if( isCatch ) return;resolveFn = callback;return this;};Promise.prototype.catch = function ( callback ) {if( isThen ) return;rejectFn = callback;return this;};Promise.prototype.finally = function( callback ) {finallyFn = callback;return this;};callback( resolve, reject );};

這里是借鑒了 Vue 雙向數(shù)據(jù)綁定的實(shí)現(xiàn)方法,在狀態(tài)改變的時(shí)候執(zhí)行對(duì)應(yīng)的 then / catch / finally 方法。

但是這里沒辦法鏈?zhǔn)秸{(diào)用,遇到了一個(gè)矛盾的地方。下面的示例僅僅按 .then().catch().finally() 這樣調(diào)用的順序講

1、then 方法如果不返回實(shí)例本身,那么 catch 和 finally 方法就沒辦法鏈?zhǔn)秸{(diào)用,因?yàn)?this 的指向不是原實(shí)例了。

2、then 方法如果返回實(shí)例本身,那么 .then().then() 第二次 then 方法的 this 那依然只是那一個(gè)實(shí)例,這里應(yīng)該是,如果上一次 then 方法的返回值是一個(gè) Promise 則是這個(gè) Promise,如果不是 Promise,則是一個(gè)新的 Promise。

所以沖突了,我決定再想想,如果想不出來就只能去參考源碼了。

?

轉(zhuǎn)載于:https://www.cnblogs.com/xwant/p/9042244.html

總結(jié)

以上是生活随笔為你收集整理的浅谈用原生 JS 模仿个Promise 的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。