25.Promise原理と実装

前の記事24.Promises / A +の仕様が約束/ A +標準を説明し、我々は手動で自分の約束を約束/ A +仕様に準拠を達成しなければなりません。

仕様によると、三つの状態があり約束pendingfulfilledという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 { // 2.2.1 IF(isFunction(onFulfilled)|| isFunction(onRejected)){ この .onFulfilled = onFulfilled; この .onRejected = onRejected; } // 2.2。 7、//そして約束を返す必要がありますが、それはまた、他のルールがあります。//ここで最初の直接現在の約束に戻るかどうかを返し、これを ; };











関数 isFunctionFUNC {戻りtypeof演算 FUNC === '関数' ; }関数ISOBJECTOBJ {戻りtypeof演算 OBJ === 'オブジェクト'}





その後、我々は2つの機能を定義し、約束をに変換することができますfulfilledrejected

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)){ // 2.2.4 //非同期実行がonFulfilledことを確実にするために必要とonRejected、//れます回転時間スライス内のイベントの後、次に呼び出され、コールスタックが空です。//詳細については、http://one-pieces.me/2018/11/14/24-Promises-A-%E8%A7%84%E8%8C%83/#3-%E6%B3%を参照してください87 %%% E9 A8 8(a) の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);
}
}

// 然后修改 Promise 构造函数
function (resolver) {
this.state = PENDING;
// 值或原因
this.value = void 0;
safelyResolveThen(this, resolver);
}

到这里,Promise 最核心的功能已经实现。可以很容易地看出,这里 Promise 的底层实现使用了回调(callback)

原文:大专栏  25.Promise原理及实现


おすすめ

転載: www.cnblogs.com/petewell/p/11606949.html