ECMAScript6 promise
4714 ワード
promise
概要:ajax戻り値はpromise宣言関数:new Promise(callback関数);
1.promise状態:デフォルト:pendingで状態を変更し、resolveまたはrejectで状態コールバックに成功する:reslove失敗状態コールバック:reject
2.promiseインスタンス化後、thenメソッドによってトリガーされ、thenはパラメータとして2つのコールバック関数を受信し、1つ目は成功し、2つ目は失敗した.
3.thenメソッドを使用した後、新しいpromiseを返します.デフォルトは正しいです.
出現の目標:コールバック地獄(callback hell)を解決し、非同期プログラミングの問題を解決する.
書き方:
書き方1
書き方2
p.then(()=>{})は戻り値があるか、戻り値がpromiseか、デフォルトでresolvedが返される場合の例:チェーン呼び出し
途中のある点でジャンプしたい場合は、promiseがデフォルトで正しい場合を返すため、
catchメソッドにも戻り値があり、resolve状態を返すpromise
印刷結果:1、2、3エラー、5
Promise.all
関数はallメソッドを実行し、完了したら配列を返し、resolveでこの配列例を受信します.
もし間違いがあったらPromise.allはcatchで最初のエラー(一意)を処理し、残りのエラーは処理しません.
正しいブランチが行かず、エラーが発生した場合は、最初に発生したブランチのみを処理します.
Promise.race
Promiseコレクションの中で、どのpromiseが先に完成して、誰を処理して、残りは操作しません
async await
概要:ES 8 2017は同期方式を新たに使用し、非同期操作例を実行する.
コード解釈:最初のコールバック関数を実行してデータdata 1を取得し、data 1の状況を判断し、さらに後続の非同期操作を行う利点:同期方式を用いて、非同期操作内容を書く
概要:ajax戻り値はpromise宣言関数:new Promise(callback関数);
1.promise状態:デフォルト:pendingで状態を変更し、resolveまたはrejectで状態コールバックに成功する:reslove失敗状態コールバック:reject
2.promiseインスタンス化後、thenメソッドによってトリガーされ、thenはパラメータとして2つのコールバック関数を受信し、1つ目は成功し、2つ目は失敗した.
3.thenメソッドを使用した後、新しいpromiseを返します.デフォルトは正しいです.
出現の目標:コールバック地獄(callback hell)を解決し、非同期プログラミングの問題を解決する.
var p = new Promise((res,rej)=>{
//res,rej , ,
//PromiseStatus , ,
// return res,rej
})
書き方:
書き方1
p.then((data)=>{
//promise
console.log(data)
},()=>{
console.log(' ');
}) /// ,
書き方2
p.then(()=>{
console.log(' ')
})
p.catch(()=>{
console.log(' ')
})
p.then(()=>{})は戻り値があるか、戻り値がpromiseか、デフォルトでresolvedが返される場合の例:チェーン呼び出し
p
.then(()={
console.log(1);
//then ,
})
.then(()={
console.log(2);
})
.catch((err)={
console.log(err)
})
途中のある点でジャンプしたい場合は、promiseがデフォルトで正しい場合を返すため、
Promise.reject(' ')
メソッドとnew Promise((resolve,reject)=>{ reject(' ') })
メソッドを投げ出すことができます.Promise.reject(reason)メソッドは、rejectedのステータスを持つ新しいPromiseインスタンスも返します.var P1 = new Promise((resolved,rejected)=>{
resolved('start count!');
})
P1.then((data)=>{
console.log(data);
}).then(()=>{
console.log('1');
}).then(()=>{
console.log('2');
return Promise.reject('3 ');
}).then(()=>{
console.log('3');
}).then(()=>{
console.log('4');
}).catch((err)=>{
console.log(err);
})
//1
//2
//3
catchメソッドにも戻り値があり、resolve状態を返すpromise
var P1 = new Promise((resolved,rejected)=>{
resolved('start count!');
})
P1.then((data)=>{
console.log(data);
}).then(()=>{
console.log('1');
}).then(()=>{
console.log('2');
return Promise.reject('3 ');
}).then(()=>{
console.log('3');
}).then(()=>{
console.log('4');
}).catch((err)=>{
console.log(err);
}).then(()=>{
console.log('5');
});
印刷結果:1、2、3エラー、5
Promise.all
関数はallメソッドを実行し、完了したら配列を返し、resolveでこの配列例を受信します.
Promise.all([
$.ajax(...),
$.ajax(...),
$.ajax(...)
]).then(arr=>{
console.log(arr);
},(res)=>{
alert(" : "+res);
});
もし間違いがあったらPromise.allはcatchで最初のエラー(一意)を処理し、残りのエラーは処理しません.
var a1 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
resolved('A1');
},1300);
});
var a2 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
//resolved('A2');
rejected('A2 ')
},600);
});
var a3 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
//resolved('A3');
rejected('A3 ');
},900);
});
var allP = Promise.all([a1,a2,a3]);
allP.then((args)=>{
console.log('-----------success-------------')
args.forEach((item)=>{
console.log(item);
})
},(err)=>{
console.log('------------failed------------')
console.log(err);
});
//------------failed------------
//A2
正しいブランチが行かず、エラーが発生した場合は、最初に発生したブランチのみを処理します.
Promise.race
Promiseコレクションの中で、どのpromiseが先に完成して、誰を処理して、残りは操作しません
var a1 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
resolved('A1');
},1300);
});
var a2 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
resolved('A2');
},600);
});
var a3 = new Promise((resolved,rejected)=>{
setTimeout(()=>{
resolved('A3');
},900);
});
var allP = Promise.race([a1,a2,a3]);
allP.then((args)=>{
console.log('-----------success-------------')
console.log(args);
},(err)=>{
console.log('------------failed------------')
console.log(err);
});
//-----------success-------------
//A2
async await
概要:ES 8 2017は同期方式を新たに使用し、非同期操作例を実行する.
async function fn1(){
//
// , ,
let data1 = await $.get({url:'xxx',dataType:'json'});
if(data1>10){
let data2 = await $.get({url:'xxx',dataType:'json'});
}else{
let data3 = await $.get({url:'xxx',dataType:'json'});
}
console.log(data1,data2,data3)
}
コード解釈:最初のコールバック関数を実行してデータdata 1を取得し、data 1の状況を判断し、さらに後続の非同期操作を行う利点:同期方式を用いて、非同期操作内容を書く