Promise:
【第一弾 Promiseとは】あとでPromise.allなど非同期処理を並列で行うこととか別で書きます。
【async/awaitは更にPromiseを可読性よく書くようにしたもの】ですのでそのもとを知るとわかりやすいとおもいました!
まずJSには同期処理と非同期処理があります。
・同期処理とは、上から順番に処理を実行していくことです。
関数A(同期処理)
↓
関数B(同期処理)
↓
関数C(同期処理)
だけどこの一連の処理が完了させる場合、「関数B」の処理がクソ重くて動かなかった場合、「関数C」はただただぼけーーーっと関数Cの順番がくるのを待っているだけで何も実行されない。
これが同期処理です。
・非同期処理とは、上から順番に処理を実行しつつ非同期処理に結果が返ってくるのを待たずに次の処理を実行するという仕組み。
A関数(同期処理)
↓
B関数(非同期処理)
↓
C関数(同期処理)
「B関数」の処理がクソ重くても非同期処理にしてあるから、先にC関数実行していいよという流れです。
・非同期処理の結果が返ってきたあとどうするのか。
関数A(日付データを取得する)
↓
関数B(日付データから西暦を抽出する)
function getDate() {
var date = new Date;
}
function getYear(data) {
var year = data.getFullYear();
}
日付データ取得後に、取得したデータをもとにgetYear()(西暦を計算する関数)を実行。なので日付データ取得がうまくいかないとgetYear()は実行できない状態です。
なのでこのgetDate()の処理が成功したあとにgetYear()を実行するようにcallbackを使って書き直して見る。
function getDate(callback) {
callback(new Date);
}
getDate(function(data) {
getYear(data);
});
それならコールバックの連鎖つくれるやんとなって下記のようになる(これはコールバック地獄で処理をおうのが大変でクソコード認定される)
getDate(function(data1) {
getYear(function(data2) {
getSomething(function(data3) {
getAnotherThing(function(data4) {
});
});
});
});
このコールバック地獄を解消してくれるのがPromiseです!
PromiseはPromiseオブジェクトを作成して簡潔に非同期処理がかけるというもので、Promiseオブジェクト作成は下記の様に書きます。
・pending(待機中)/resolve(成功時の処理)/reject(失敗時の処理)
var result = new Promise()
var result = new Promise(function(resolve, reject) {
resolve(new Date);
reject(new Error('Error'));
})
このあと非同期処理をおこなうようにするには.thenを使った処理を書きます。
result.then(function(data){
console.log(data.getFullYear());
).catch(function (error) {
console.log(error);
});
}
thenをつなげてかくことによって連鎖(メソッドチェーン)した非同期処理をかくことができる。
function something1() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve('なにか処理');
}, 3000)
})
}
result.then(関数A).then(関数B).then(関数C).catch(function (error) { console.log(error); });
【ES6】だとこんなふうに書きます。
result.then( (data) => console.log(data.getFullYear()) );