関数を呼び出したい場合は、この関数でネットワーク リクエストを送信します。
- ネットワーク リクエストの送信が成功した場合は、送信が成功したことを呼び出し元に通知し、関連するデータを返します。
- ネットワーク要求の送信に失敗した場合、呼び出し元に失敗とエラー メッセージが通知されます。
Promise がない場合は、実際に自分で実装して、対応するコールバックを取得できます。しかし、
- コールバック関数、コールバック関数の名前、およびコールバック関数の使用を自分で設計する必要があります。
- さまざまな人やさまざまなフレームワークがさまざまなソリューションを設計しているため、他の人のソース コードやドキュメントを辛抱強く読むのは非常に面倒です。
標準を定義し、呼び出し元に約束を与えることができれば、データを呼び戻すことができます。開発者は、統一された標準を使用して同様のコードを記述できるため、学習コストを削減できます。そこで、非同期コードのジレンマを解決するために ES6 の Promise が使用されます。
目次
1.約束の理解
Promise は、 promises、 promises 、および contractに変換できるクラスです。
必要な場合は、呼び出し元に約束を与えることができます:一定期間後に呼び出し元にデータをコールバックします。この場合、Promise オブジェクトを作成できます。
new を介して Promise オブジェクトを作成する場合、 executorと呼ばれるコールバック関数を渡す必要があります。
- このコールバック関数はすぐに実行され、他の 2 つのコールバック関数の解決と拒否が渡されます。
- resolveコールバック関数を呼び出すと、 Promise オブジェクトのthenメソッドによって渡されたコールバック関数が実行されます。
- rejectコールバック関数を呼び出すと、 Promise オブジェクトのcatchメソッドによって渡されたコールバック関数が実行されます。
const promise = new Promise((resolve, reject)=>{ //调用resolve,那么then传入的回调会被执行 resolve("成功信息") //调用reject,那么catch传入的回调会被执行 reject("错误信息") }) promise.then(res => { console.log(res) }).catch(err => { console.log(err) })
Promise の使用中は、次の 3 つの状態に分けることができます。
- executorでコードを実行すると、保留中になります。初期状態で、承認も拒否もされていません。
- resolveが実行されると、それは満たされた状態になり、Promise が満たされました。これは、操作が正常に完了したことを意味します。
- rejectが実行されると、拒否された状態になり、Promise が拒否されました: 操作が失敗したことを意味します。
2. コールバック関数 Executor
Executor は、Promise を作成するときに渡す必要があるコールバック関数です. このコールバック関数はすぐに実行され、2 つのパラメーターが渡されます:
new Promise((resolve, reject) => {
console.log("执行executor代码")
})
- resolveを通じて、(満たされた) Promise のステータスが満たされることができます。これを解決済み (解決済み) と呼ぶこともできます。
- rejectを介して、 Promise の状態を拒否 ( reject )できます。
- resolve を呼び出したときに、resolve によって渡された値が Promise ではない場合、Promise の状態は満たされた (満たされた) に変更されます。
- 後で reject を呼び出すと、応答がなくなります(このコード行が実行されないということではなく、Promise の状態を変更できないということです)。
3. 解決の異なる値の違い
ケース 1:通常の値またはオブジェクトがに渡された場合、この値はthen コールバックのパラメーターとして使用されます。
new Promise((resolve, reject) => {
resolve("normal resolve")
}).then(res =>{
console.log("res:", res)
})
ケース 2:別の Promiseが渡された場合、新しい Promise が元の Promise の状態を決定します。
new Promise((resolve, reject) => {
resolve(new Promise((resolve, reject) => {
setTimeout(() => {
resolve("第二个Promise的resolve")
}, 3000)
}))
}).then(res => {
console.log("res:",res)
}).catch(err => {
console.log("err:",err)
})
ケース 3:オブジェクトが resolve に渡され、オブジェクトがthen メソッドを実装している場合、 thenメソッドが実行され、 then メソッドの結果に従って Promise の状態が決定されます。
new Promise((resolve, reject)=>{
resolve({
then: function(resolve, reject) {
resolve("thenable value")
}
})
}).then(res => {
console.log(res)
})
4.thenメソッド
then メソッドは Promise オブジェクトのメソッド (インスタンス メソッド) です。
Promise.prototype.then は Promise のプロトタイプに配置されます
then メソッドは 2 つのパラメーターを受け入れます。
フルフィルドのコールバック関数: ステータスがフルフィルドになったときにコールバックされる関数。
Reject コールバック関数: 状態が reject になったときにコールバックされる関数。
const promise = new Promise((resolve, reject) => {
resolve("resolve")
reject("reject")
})
promise.then(res => {
console.log("res:", res)
}, err => {
console.log("err:", err)
}
)
//等价于
promise.then(res => {
console.log("res:", res)
}).catch(err => {
console.log("err:", err)
})
then メソッドは 2 つのパラメーターを受け入れることができますが、.catch メソッドを使用する方が読みやすいです。
- 呼び出しごとに、対応するフルフィルド コールバックを渡すことができます。
- Promise の状態が満たされると、これらのコールバック関数が実行されます。
promise.then(res=>{
console.log("res1:", res)
})
promise.then(res=>{
console.log("res2:", res)
})
promise.then(res=>{
console.log("res3:", res)
})
5.キャッチメソッド
- 各呼び出しに対応する reject コールバックを渡すことができます。
- Promise の状態が reject になると、これらのコールバック関数が実行されます。
promise.catch(err => {
console.log("err1:", err)
})
promise.catch(err => {
console.log("err2:", err)
})
promise.catch(err => {
console.log("err1:", err)
}).catch(err => {
console.log("err2:", err)
}).then(res => {
console.log("res:", res)
})
promise.catch(err => {
console.log("err1:", err)
throw new Error("error message")
}).then(res => {
console.log("res:", res)
}).catch(err => {
console.log("err2:", err)
})
6.finally メソッド
const promise = new Promise((resolve, reject) => {
resolve("resolve")
reject("reject")
})
promise.then(res => {
console.log("res:", res)
}).catch(err => {
console.log("err:", err)
}).finally(() =>{
console.log("finally")
})
7.解決方法
Promise.resolve("这样会简洁一点")
//等价于
new Promise((resolve) => {
resolve("fulfilled")
})
8.拒否方法
Promise.reject("简洁")
//等价于
new Promise((resolve, reject) => {
reject("reject")
})
9.すべての方法
const promise1 = new Promise((resolve, reject) => {
resolve("resolve")
reject("reject")
})
const promise2 = new Promise((resolve, reject) => {
resolve("resolve")
reject("reject")
})
const promise3 = new Promise((resolve, reject) => {
resolve("resolve")
reject("reject")
})
Promise.all([promise1, promise2, promise3]).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
10. allSettled メソッド
//创建三个promise promise1 promise2 promise3
Promise.allSettled([promise1, promise2, promise3]).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
11.レース方法
//创建三个promise promise1 promise2 promise3
Promise.race([promise1, promise2, promise3]).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
12.任意の方法
//创建三个promise promise1 promise2 promise3
Promise.any([promise1, promise2, promise3]).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})