他のAPIを約束する
- 最後に:[ES2018]後続の処理関数(パラメーターなし)を登録し、Promiseが解決されたときに関数を実行します。パラメータがない理由。解決されると、解決または拒否される可能性があるためです。どちらがパラメータを渡したかを判別できません。
- 最終的にの操作は、登録の順序に関連しています。
const pro = new Promise((resolve, reject) => {
resolve(1);
})
pro.finally(() => console.log("finally1"))
pro.finally(() => console.log("finally2"))
pro.then(resp => console.log("then1", resp * 1));
pro.then(resp => console.log("then2", resp * 2));
pro.catch(resp => console.log("catch1", resp * 1));
pro.catch(resp => console.log("catch2", resp * 2));
const pro = new Promise((resolve, reject) => {
resolve(1);
})
pro.then(resp => console.log("then1", resp * 1));
pro.then(resp => console.log("then2", resp * 2));
pro.catch(resp => console.log("catch1", resp * 1));
pro.catch(resp => console.log("catch2", resp * 2));
pro.finally(() => console.log("finally1"))
pro.finally(() => console.log("finally2"))
静的メソッドの解決
const pro = new Promise((resolve,reject)=>{
resolve(1;)
})
上記のコードは次のものと同等です。
const pro = Promise.resolve(1);
- 渡されたデータがpromiseの場合は、promiseを直接返します
- グーグルはこのようなものですが、他のものは必ずしもそうではありません。
const p = new Promise((resolve,reject)=>{
resolve(1;)
})
const pro = Promise.resolve(p);
//那么pro和p相等
console.log(p === pro); //true;
静的メソッド拒否
const pro = new Promise((resolve,reject)=>{
reject(1;)
})
上記のコードは次のものと同等です。
const pro = Promise.reject(1);
すべて
Promise.all([pro1,pro2,pro3......])
- 新しいpromiseが返されます。この新しいpromiseは、promise1、promise2 ...まで、新しいpromiseの解決済み状態をトリガーしないため、渡されたpromiseが解決済み状態になります。
といった:
const newPro = Promise.all([Promise,Promise,Promise,.....]);
newPro.then(data=>{
console.log(data);//这里输出要等到所有的Promise变成resolved状态。
})
- 例
function getRandom(min,max){
return Math.floor(Math.random() * (max - min) + min);
}
const proms = [];
for(let i = 0 ; i < 10; i++){
proms.push(new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('resolve',i);
resolve(i);
},getRandom(2000,3000));
}))
}
const pro = Promise.all(proms);
pro.then(data=>{
console.log(data);
})
pro.then(data=>{
console.log(data);
})
データを出力するには、すべてのプロミスが解決されるまで待つ必要があります。拒否されると、結果は出力されません。
- たとえば、上記のコードを書き直します
function getRandom(min,max){
return Math.floor(Math.random() * (max - min) + min);
}
const proms = [];
for(let i = 0 ; i < 10; i++){
proms.push(new Promise((resolve,reject)=>{
setTimeout(()=>{
if(Math.random() > 0.5){
console.log('resolve',i);
resolve(i);
} else {
console.log('reject',i);
reject(i)
}
},getRandom(2000,3000));
}))
}
const pro = Promise.all(proms);
pro.then(data=>{
console.log(data);
},err=>{
console.log('err',err);
})
Promise.all()アプリケーションシナリオ
結果は、すべてのプロミスが解決されるのを待つことに基づいて出力されます。これは、ページ内の複数のリクエストのマージに適用でき、ページ上のすべてのリクエストが完了した後の処理に適用できます。1つが失敗すると、失敗します。
Promise.race()
最初に完了するのは完了することであり、最初に失敗するのは失敗することです。1つあれば全体は同じです。誰が最初に終了し、誰が最初に失敗するかを確認します。
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
const proms = [];
for (let i = 0; i < 10; i++) {
proms.push(new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
console.log('完成', i);
resolve(i);
} else {
console.log('失败', i);
reject(i)
}
}, getRandom(2000, 3000));
}))
}
const pro = Promise.race(proms);
pro.then(data => {
//有完成的立马运行到这里
console.log('有人完成了',data);
},err=>{
//有失败的立马运行到这里
console.log('有人失败了',err);
})