いくつかの単語の男は、コードに直接、言いました
ES5モジュラーパッケージを介して、外側にプロパティを暴露
(関数(ウィンドウ){
PENDINGのconst = '保留';
constの決議=「成就」
CONSTが拒否=「拒否」
関数MyPromise(excutor){
constの自己=この; //プロミスオブジェクト、非同期実行、およびデータを防止する方法保存が必要な取得します
self.value =未定義。
self.status = PENDING。
状態が変化しない場合self.callbacks = [] //、格納する必要があるからコールバック関数は、コールバックメソッドを取得します。
関数解決(値){
self.value =値。
self.status =解決されました。
self.callbacks.map(CB => {
setTimeout(()=> {//タイマーシミュレーション混沌のそれ以外の順序、あなたが非同期コールバックの実装を確認する必要があり、非同期で実行
cb.onResolved(self.value)
})
})//正常に保存されたコールバック関数を実行
}
関数は、{(値)を拒否します
self.value =値。
self.status = REJECTED。
self.callbacks.map(CB => {
setTimeout(()=> {
cb.onRejected(self.value)
})
})//失敗したコールバック関数を保存し実行します
}
アクチュエータ機能でイニシアチブは、あなたがキャッチミスする必要がある場合は、エラーをスロー// {みてください、と拒否へのステータス変更
excutor(解決、拒否)
}キャッチ(エラー){
拒否(エラー)
}
}
MyPromise.prototype.then =関数(onResolved、onRejected){
constの自己=この//保存約束の現在の目標
{(、解決拒否)新しい約束を返します
onResolved = onResolved === '関数'?onResolved:V => V
onRejected = onRejected === '関数' onRejected :?エラー=> {スローエラー} //例外を実装パススルー
//現在のステータスを確認
//約束非同期タスクの実行であれば、その方法は同期されている方法は、あなたがコールバックを実行することはできませんので、約束は、保留されている状態では、あなたは保存する必要がある場合
IF(self.status === PENDING){
//コールバックここにちょうど保存し、さらに処理する必要がありますので、現在の約束がオブジェクトを変更しないで、治療と同様の成功に対処する必要があります
各保存self.callbacks.push({onResolved、onRejected})//次にonResolvedを含むオブジェクトのメソッドは、二つの機能をonRejected
}そうであれば(self.status ===解決済み){
// 1で、その後非同期実行をコールバック保証、プラスのsetTimeout
// 2. onResolvedでの主導権がエラーをスローした場合は、エラーをキャプチャする必要があります
//プロミスオブジェクトの結果によれば、3次のコールバック成功または失敗を決定するために、返されて実行されます
// 4.プロミスは、リターン2として、値を返した場合、直接実行(2)を解決
// 5.約束がオブジェクトを返すように約束された場合、結果はpromise.thenにより取得することを約束
setTimeout(()=> {
{試します
CONST結果= onResolved(self.value)
(MyPromise instanceofの結果){//戻り値は、オブジェクトの約束でない場合
//プロミスオブジェクトを返します。
result.then(
値=> {//戻り値はオブジェクトの約束であり、成功し、それはこの機能を実行します
解決(self.value)
}
エラーが=> {//戻り値はプロミスオブジェクトであり、失敗し、その機能を実行します
rejecte(self.value)
}
)
約束していない}他{//オブジェクトを返します
解決(self.value)
}
}キャッチ(エラー){
成功への//プロセス、唯一のコールバック関数を変更する必要があり、私はあまりにも長い間書きません
}
})
}エルス{//拒否状態}
}
}
window.MyPromise = MyPromise //外側にメソッドを公開
})(窓)
ここでは、ほとんどの簡単な約束を書き終え、だけでなく、約束の活用の原理を理解します
クリアしない場合、私を修正してください、だけでなく、というコメント