約束のオブジェクト深い理解

 ディレクトリ

基本的な使い方

別の例は、約束を返します。

Promise.prototypeof.then 

Promise.prototype.catch 

Promise.prototype.finally() 

Promise.resolve()

Promsie.reject()

実行順序の約束

 

基本的な使い方

プロミスオブジェクトはコンストラクタで、次の例は、ターゲットの約束を生成し、

プロミス= CONST 新しい新しい約束((解決)=>拒否{
     IF真の){ 
        解決( '非同期操作が成功した' ); 
    } { 
        rejecte(「非同期動作」が失敗しました); 
    } 
})

約束コンストラクタパラメータとして関数をとり、この関数は2つのパラメータをとり、これらのパラメータは関数であります

約束は解決して変更しつつ、第1機能状態についての結果は、成功した非同期および非同期に成功し、パラメータとして配ります

非同期障害の第二の機能、およびパラメータのように渡す非同期失敗の結果、状態は拒否約束するように変更されます

 

別の例は、約束を返します。

典型的には、関数は、エラーメッセージが非同期で返す拒否解決機能は、通常の理想値を返し、この値はまた、他の例の約束であってもよいです

リターンが約束の別の例であれば、この例では、彼の自然な状態が失敗し、約束の現在のインスタンスの状態を判断します

P1 = CONST 新しい新しいプロミス(関数(解決、拒否){
   // ... 
}); 

CONST P2 = 新しい新しいプロミス(関数(解決、拒否){
   // ... 
  のsetTimeout(()=> {解決(P1) 、2000}); // P1 P2は2Sまで待つのではなく、状態の状態を決定します 
)}

 

Promise.prototypeof.then 

関数は、2つのパラメータを受け付ける方法は、次いで、その結果は、典型的にパラメータとして非同期約束を必要と

最初の関数は非同期、成功(解決)の実行であります

最初の機能は、非同期障害(分解)を実行(関数を送信することができない、非同期リスナーメソッドキャッチ失敗を使用)であります

promise.then((RES)=> { 
    にconsole.log(RES); 
}、(REJ) => { 
    cnosole.log(REJ); 
})

あなたがチェーンコールをすることができますように、新しい方法は、その後、オブジェクトを約束します。戻り値がある場合、戻り値は、パラメータの約束として、新しいオブジェクトに渡されます

promise.then((RES)=> { 
    にconsole.log(RES); 
    戻り 'newPromise' ; 
}、(REJ) => { 
    cnosole.log(REJ); 
})。次に、((RES => { 
    にconsole.log (RES); 
})

新しい約束返されるオブジェクトは、そのようなオブジェクトの約束の新しいインスタンスを返すように、非同期操作が存在する場合は後者の方法が実行されるまで、状態変化が約束するとき、我々は待ちます

 

Promise.prototype.catch 

上述したように、2つの成功と失敗実行されるパラメータを受信する方法の機能、および使用キャッチの機能推奨される方法の故障があります

方法は、次に、キャッチは、第二のパラメータの機能を満たすことができるが、それはコードで直感的であることができます

= 1をみましょう
約束させ = 新しい(プロミス機能{)、(決意を拒否する
     場合(== 10 ){ 
        解決が( '成功' ); 
    } { 
        拒否( '失败' ); 
    } 
})。

promise.then(RES => { 
    にconsole.log(RES); 
})。キャッチ(ERR => {   
    にconsole.log(ERR); 
})

それは今までに撮影されるまで、エラーの約束は、本質的に「バブル」をオブジェクト、それは常にバック、通過します。言い換えれば、エラーは常に次のだろうcatch声明キャプチャ。

 

 Promise.prototype.finally() 

最後に関係なく、プロミス最終状態を標的化するために使用される方法の動作は、指定され実行されます。

約束
最終的に、(()=> {})。

 

Promise.resolve()

4例の下に、既存のオブジェクトの約束オブジェクトのポイントを変換します

1.  引数が約束のインスタンスである場合には、promise.resolveは、任意の変更を行うことはありません、このインスタンスがそのまま返されます。

2.引数はthenableオブジェクトである場合。thenableオブジェクトは、その後、次のオブジェクトのような方法を有する物体を指します。Promise.resolve方法は、プロミスオブジェクトにオブジェクトを変換し、その後直ちに実行thenableオブジェクトのthenメソッドを。

せthenable = { 
  次いで:関数(解決、リジェクト){ 
    解決( 42 )。
  } 
}。

聞かせて、P1 = Promise.resolve(thenable)。
p1.then(関数(値){ 
  にconsole.log(値);   // 42 
});

3.パラメータ値がある場合、元の又は有しないthenオブジェクトメソッドを、Promise.resolveの  方法戻り、新しいオブジェクトの状態を約束します  resolved新しいオブジェクト・プロミスのコード生成の次の例p文字列があるため  Hello 、非同期動作に属していない(決意方法は、次いで、対象が文字列メソッドを持っていない場合)、およびプロミスインスタンスが生成されている状態からの復帰は  resolved、コールバック関数が直ちに実行されます。Promise.resolve メソッドのパラメータは、同時にコールバック関数に渡されます。

constのP = Promise.resolve( 'こんにちは' ); 

p.then(関数(S){ 
  にconsole.log(S)
})。
// こんにちは

4.パラメータなしPromise.resolve方法でオブジェクトを約束発信者が直接解決状態を戻すことができます。プロミスオブジェクトが「イベントループ」(イベントループ)ではなく、次のラウンド開始「イベントループ」の現在のラウンドの終了時にときに実行される)(直ちに解決、注意すべきです

setTimeout(関数(){ 
  にconsole.log( '三' ); 
}、 0 ); //は、 "イベントループ"で実行を開始する
 
。Promise.resolve()は(関数(){ 
  にconsole.log( ' TWO ' ); 
}); //実行終了"イベントループ"の現在のラウンド
 
はconsole.log( '一' ); 

// 
// TWO 
// スリー

 

Promsie.reject()

また、オブジェクトに既存のオブジェクトを変換するための約束が、オブジェクトの状態の約束を拒否されました

constのP = Promise.reject( '間違いました');
 p.catch(REJ =>にconsole.log(REJ))

 

実行順序の約束

プロミスコンストラクタ自体は同期して行われます

次に、方法は、マイクロタスク(マイクロタスク)キューに配置されます

マクロタスク(マクロタスク)キューにsetTimeoutをタイマー

同期タスクは、実行のメインスレッドに、タスクキュータスクマイクロ順次実行されると、タスクキューは、メインタスクの実行にマイクロマクロタスクキュー順次後空になったとき

setTimeout(() => {
    console.log(0);
},0)

new Promise(resolve => {
    resolve(1);
    Promise.resolve().then(t => {
        console.log(2);
    })
    console.log(3);
}).then(t => {
console.log(t);
})

console.log(4);
// 3
// 4
// 2
// 1
// 0

现在分析上面的代码

 1. 遇到定时器,将它放到宏任务队列中(这是第一个宏任务)

 2. 同步执行构造函数

 3. 在构造函数中遇到一个 then 方法,将他放到微任务队列中(这是第一个微任务)

 4. console.log(3) 执行,打印出 3

 5. 遇到第二个 then 方法,将他放到微任务队列的末尾

 6. console.log(4) 执行,打印出 4

 7. 读取微任务队列中的任务,依次打印出 2  1

 8. 读取宏任务队列中的任务,打印出 0

 

おすすめ

転載: www.cnblogs.com/wangjie-nf/p/10974040.html