66、promiseを深く理解する:promiseの三つの状態とチェーンコール

16511 ワード

https://www.jianshu.com/p/dc61ea153874
https://blog.csdn.net/endeavor_NO 1/articale/detail/83416949
promiseの出現の目的はJavaScriptの中の非同期を処理するためで、更に地獄に戻ることを免れます.
一、プロモーションの三種類の状態と基礎使用
promiseには三つの状態があります.pendingは未決です.reolveは成功と理解できます.rejectは拒否と理解できます.
簡単なpromiseの例:
let promiseDemo = new Promise((resolve, reject) => { // code resolve('success') // code reject('failed') }) promiseDemo.then((result) => { console.log(result) }, (result) => { console.log(result) }) 
promiseの最終状態は固まります.成功したらリジェクトを実行しても状態は変わりません.
二、promiseのthen方法を紹介するいくつかの方法
一つ目は上の例です.
promiseDemo.then((result) => { console.log(result) }, (result) => { console.log(result) }) 
二つ目は一つ目の方法の二つ目の関数をcatchとして出します.効果は一つ目と同じです.
promiseDemo.then((result) => { console.log(result) }).catch((result) => { console.log(result) }) 
第3の形態は、1つの状態だけを単独で受信してもよい.
promiseDemo.then((result) => { console.log(result) }) //        promiseDemo.catch((result) => { console.log(result) }) //        ,             promiseDemo.then(null, (result) => { console.log(result) }) //        
三、プロモーションのチェーン呼び出し(二つの状況に分けて検討する)
promiseのthenメソッドはその後もpromiseオブジェクトに戻ります.
例は以下の通りです
let test = new Promise((resolve, reject) => { let random = Math.random() if (random > 0.5) { resolve('  0.5') } else { reject('    0.5') } }) let p = test.then((result) => { console.log(result) return result }).catch((result) => { console.log(result) return result }).then((result) => { console.log(result) return result }).then((result) => { console.log('last', result) }) console.log(p) 
nodeを使って実行した結果は以下の通りです.
  p:  Promise { > }   0.5   0.5 last   0.5 
結果から、then方法を使用するとプロミセオブジェクトが戻り、then方法で呼び出され続け、取得したパラメータを再度呼び出すことができるのは前のthen方法returnの内容であることが分かります.同時に、私達はPが先にプリントアウトされたことを見て、promise自身が非同期であることを証明しました.しかもp自身もpending状態のpromiseの対象です.
上記の例は、最初のthenの後に戻ってきたpromiseがrejectの状態にならない場合ですが、最初のthenの後に手動でreject状態を含む可能性のあるpromiseに戻ると、エラーチェーンコール中のエラー処理が大きな問題になります.これは私達がpromiseの中のrejectの状態の中で直接に対応する誤りの処理の構造を書くことを必要とします.具体的な例は次の文章を参照してください.
四、Promise.resove()を使って素早く成功状態のpromiseオブジェクトを取得する.
let a = Promise.resolve(123) a.then((result) => { console.log(result) // 123 }) let b = Promise.resolve({name:'xiaoming', age:18}) b.then((result) => { console.log(result) // {name:'xiaoming', age:18} }) 
上記の例では、Promise.resoveを通じて、一つの文字列、数字または対象などを成功状態のPromiseオブジェクトに変換することができます.
しかし、どうやって私たちはプロミスの対象をパラメータとしてPromise.resoveに渡す方法がありますか?
let test = new Promise((resolve, reject) => { setTimeout(() => { resolve('success') }, 1000) }) let p = Promise.resolve(test) console.log(p === test) //true 
結果的には、プロミゼオブジェクトをPromise.resoveに渡す方法がそのまま返されます.
五、Promise.reject()を使って拒否状態のpromiseオブジェクトを素早く取得する
使い方はPromise.resoveと一致しています.
作者:李悦之
リンク:https://www.jianshu.com/p/dc61ea153874
ソース:略書
著作権は作者の所有に帰する.商業転載は作者に連絡して授権を獲得してください.商業転載ではないので、出典を明記してください.