javascript
浅谈用原生 JS 模仿个Promise 的实现
在嘗試寫一個(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: How Many Answers Are
- 下一篇: JavaScript快速入门-ECMAS