promise:promiseの3つの状態とチェーン呼び出しを深く理解する
3133 ワード
promiseが登場した目的はJavaScriptの非同期を処理することであり,コールバック地獄を避けることである.
一、promiseの三つの状態と基礎使用
promiseにはpending/reslove/rejectの3つの状態があります.pendingは未決であり,resolveは成功と理解でき,rejectは拒否と理解できる.
簡単なpromiseの例:
promiseの最終状態は凝固し,成功してからreject('failed')状態を実行しても変化しない.
二、promiseのthen方法伝参のいくつかの方式
1つ目は、上記の例です.
2つ目は、1つ目の方法の2つ目の関数をcatchとして取り出し、効果は1つ目と同じです.
3つ目は、1つのステータスのみを受信することもできます.
三、promiseのチェーン呼び出し(二つの状況に分けて討論する)
promiseのthenメソッドはその後もpromiseオブジェクトを返します
例は次のとおりです.
nodeを使用して実行した結果は次のとおりです.
結果から、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オブジェクトをすばやく取得
上の例ではPromiseを通じてresolve()は、文字列、数値、またはオブジェクトなどを成功状態のPromiseオブジェクトに変換します.
しかし、promiseオブジェクトをパラメータとしてPromiseに渡すにはどうすればいいですか.resolve()の方法はどうなりますか?
結果から見ると、promiseオブジェクトをPromiseに渡す.resolve()メソッドは直接返されます.
五、Promiseを使う.reject()拒否状態のpromiseオブジェクトをすばやく取得
使用方法とPromise.resolve一致.
一、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一致.