手寫promise實現過程
// 定義好mypromise的三種狀態,用三個常量來接收
const pending = 'pending' // 等待
const fulfilled = 'fulfilled' // 成功
const rejected = 'rejected' // 失敗
class mypromise catch (e)
}// mypromise 有三種狀態 分別是:pending、fulfilled、rejected,一開始是pending狀態
status = pending
value = undefined // resolve傳遞的值
reason = undefined// reject傳遞的錯誤資訊
// successcallback = undefined
successcallback = // then方法多次呼叫時且執行器裡面是非同步時需將then方法裡面的**函式依此儲存在該陣列中
// failcallback = undefined
failcallback = // 同上
resolve = (val) =>
while(this.successcallback.length) this.successcallback.shift()()
}reject = (reason) =>
while(this.failcallback.length) this.failcallback.shift()()
}then(successcallback, failcallback)
/***then方法實現鏈式呼叫 */
// 能夠讓then方法實現鏈式呼叫,說明then方法返回的還是乙個 promise物件,我們現在就再建立個 promise物件 promise2,並將其返回
let promise2 = new mypromise((resolve, reject) => catch(e)
}, 0);
// resolve(x)
// 呼叫成功**函式,並傳遞成功時的值
//successcallback(this.value) // then方法被多次呼叫時,同步情況無需處理,直接呼叫即可
} else if(this.status === rejected) catch(e)
}, 0);
} else catch(e)
}, 0);
})// this.failcallback = failcallback
// this.failcallback.push(failcallback)
this.failcallback.push(() => catch(e)
}, 0);})}
})return promise2;
}/***finally 無論該promise物件是成功還是失敗都會執行 接受乙個**函式作為引數 */
finally(callback) , reason => )})}
/****catch方法 */
catch (failcallback)
// 靜態方法all,接受引數是乙個陣列
static all(arr)
}for(let i=0; i, reason => reject(reason))
} else }})
}/** 靜態方法 resolve,返回值是乙個promise物件,接受乙個引數,當這個引數是promise物件時
* 就將該物件作為 resolve方法的返回值,如果是個普通值,則將該值包裹在乙個promise物件中作為
* resolve方法的返回值
*/static resolve(value)
}function newpromise(promise2, x, resolve, reject)
if (x instanceof mypromise) else
}
手寫實現Promise的全部功能
發現的問題 在此過程中,發現 自己對 函式中的this指向,和詞法環境 的一些細節沒有掌握好,實現過程很痛苦!解決 應該惡補 下面上 1 function promise executor 16 17 18 1920 function reject data 31 32 3334 35 execut...
手寫promise封裝ajax
其實,axios本身就是基於promise進行封裝的,我們之所以進行二次封裝,主要是為了能夠對錯誤資訊進行乙個集中的處理,根據不同的錯誤資訊,需要給使用者不同的提示,以便於給使用者乙個良好的操作體驗。封裝方法有很多種,基於class類的,基於建構函式的,也可以直接封裝乙個函式。具體按照個人習慣,最主...
js手寫方法之 Promise
promise與async await是es6中常用的非同步操作方法,為了深刻理解promise的用法,解讀原始碼是乙個很好的方案。其核心方法是promise建構函式,以及.then方法,其他靜態方法都是在此基礎之上封裝的 為了方便理解,以下 經過了適當刪減 promise狀態常量值 狀態還未變化 ...