前の記事24.Promises / A +の仕様が約束/ A +標準を説明し、我々は手動で自分の約束を約束/ A +仕様に準拠を達成しなければなりません。
仕様によると、三つの状態があり約束pending
、fulfilled
というrejected
我々が使用state
使用することを、約束の現在の状態を示すためにvalue
、現在の表現するために值
またはが原因
。もちろん、最も重要なthen
方法。また、例えば、いくつかの補助的な機能を必要としますisFunction
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
CONST PENDING = 0。 CONSTは =満たさ1。 CONSTは = REJECTED 2。
機能 () { この .STATE = PENDING; この = .Valueの空隙0 ; }
約束 .prototype.then = 関数(onFulfilled、onRejected) { IF(isFunction(onFulfilled)|| isFunction(onRejected)){ この .onFulfilled = onFulfilled; この .onRejected = onRejected; } 返し、これを ; };
関数 isFunction(FUNC) {戻りtypeof演算 FUNC === '関数' ; }関数ISOBJECT(OBJ) {戻りtypeof演算 OBJ === 'オブジェクト'。}
|
その後、我々は2つの機能を定義し、約束をに変換することができますfulfilled
かrejected
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
関数 doResolve(プロミス、値) { promise.state =成就; promise.value =値; IF(isFunction(promise.onFulfilled)){ のsetTimeout( () => { promise.onFulfilled(promise.value); }、 0); }戻りプロミス;}関数doReject(プロミス、理由) {
promise.state = REJECTED。 promise.value =理由。もし(isFunction(promise.onRejected)){ たsetTimeout( () => { promise.onRejected(promise.value); }、0); }
リターン約束。 }
|
最後に、我々はまた、単に定義されます、リゾルバを必要とdoResolve
し、doReject
コンストラクタの約束にさらされます。我々は通常の方法、新たな約束であるについて考えますか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
function safelyResolveThen(promise, then) { try { then(function (value) { doResolve(promise, value); }, function (reason) { doReject(promise, reason); }) } catch (e) { doReject(promise, e); } }
function (resolver) { this.state = PENDING; this.value = void 0; safelyResolveThen(this, resolver); }
|
到这里,Promise 最核心的功能已经实现。可以很容易地看出,这里 Promise 的底层实现使用了回调(callback)