promise:promiseの3つの状態とチェーン呼び出しを深く理解する

3133 ワード

promiseが登場した目的はJavaScriptの非同期を処理することであり,コールバック地獄を避けることである.
一、promiseの三つの状態と基礎使用
promiseにはpending/reslove/rejectの3つの状態があります.pendingは未決であり,resolveは成功と理解でき,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の最終状態は凝固し,成功してからreject('failed')状態を実行しても変化しない.
二、promiseのthen方法伝参のいくつかの方式
1つ目は、上記の例です.
promiseDemo.then((result) => {
  console.log(result)
}, (result) => {
  console.log(result)
})

2つ目は、1つ目の方法の2つ目の関数をcatchとして取り出し、効果は1つ目と同じです.
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のチェーン呼び出し(二つの状況に分けて討論する)
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メソッドを使用するとpromiseオブジェクトが返され、thenメソッドで呼び出し続けることができ、取得したパラメータが前のthenメソッドreturnの内容であることがわかります.同時に,pが先に印刷されるのを見て,promise自体が非同期であり,p自体もpending状態のpromiseオブジェクトであることを証明した.
上記の例は、1回目のthen以降に返されるpromiseではrejectの状態は現れないが、1回目のthen以降にrejectの状態を含む可能性のあるpromiseを手動で返すと、エラーチェーン呼び出し中のエラー処理が大きな問題になる.2回目のthenはエラー処理メカニズムを持たないため、これはpromiseのreject状態に対応するエラー処理メカニズムを直接書くことを要求する.具体的な例は、次の記事を参照してください.
四、Promiseを使う.resolve()成功状態の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を通じてresolve()は、文字列、数値、またはオブジェクトなどを成功状態のPromiseオブジェクトに変換します.
しかし、promiseオブジェクトをパラメータとしてPromiseに渡すにはどうすればいいですか.resolve()の方法はどうなりますか?
let test = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('success')
    }, 1000)
})

let p = Promise.resolve(test)

console.log(p === test)   //true

結果から見ると、promiseオブジェクトをPromiseに渡す.resolve()メソッドは直接返されます.
五、Promiseを使う.reject()拒否状態のpromiseオブジェクトをすばやく取得
使用方法とPromise.resolve一致.