promise とは
Promiseは、非同期処理を扱うためのオブジェクトです。
Javascriptでは、実行中の処理の完了をまってから次の処理が実行されます。前の処理の完了を待ってから次の処理を実行することを「 同期処理 」といいます。
Javascriptの非同期処理とは、メインスレッドから一時的に切り離された処理のことです。
promise を使うと、非同期処理を実行し、それが終了するまで次の処理を遅延させることができます。
Promiseは、非同期処理を扱うためのオブジェクトです。
Javascriptでは、実行中の処理の完了をまってから次の処理が実行されます。前の処理の完了を待ってから次の処理を実行することを「 同期処理 」といいます。
Javascriptの非同期処理とは、メインスレッドから一時的に切り離された処理のことです。
promise を使うと、非同期処理を実行し、それが終了するまで次の処理を遅延させることができます。
setTimeout 関数は、非同期処理の関数です。次のコードを実行すると「 No1 」、「 No3 」、「 No2 」の順で表示されます。
console.log("No1");
// 1秒後に実行する処理
setTimeout(() => {
console.log("No2");
}, 1000);
console.log("No3");
let promise = new Promise((resolve, reject) => {});
promise を操作するメソッドには、「 then 」、「 catch 」、「 finally 」があります。
let promise = new Promise((resolve, reject) => {
// promise オブジェクトの作成
});
promise.then(() => {
// 非同期処理の成功時に実行する処理
}).catch(() => {
// 非同期処理の失敗時に実行する処理
}).finally(() => {
// 非同期処理完了後に必ず実行する処理
});
then メソッドは複数つなげることができます。
function A(){
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("A");
}, 2000);
});
}
A().then((txt) => {
console.log(txt);
}).then(() => {
console.log("B");
});
非同期処理が成功した場合は、resolve関数を実行します。resolveが呼び出されると、Promiseインスタンスの thenメソッドで登録したコールバック関数が呼び出されます。
非同期処理が失敗した場合は、reject関数を実行します。rejectが呼び出されると、Promiseインスタンスの catchメソッドで登録したコールバック関数が呼び出されます。
resolve、reject それぞれのメソッドに、引数を指定することができ、thenメソッド、catchメソッドで呼び出すことができます。
決定する、解決する
拒否する
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
let num = 5;
if(num >= 5){
resolve(num);
} else {
reject(num);
}
}, 1000);
});
promise.then((value) => {
console.log(`5以上の値 ${value} のため成功`);
}).catch((err) => {
console.error(`5より小さい値 ${err} のためエラー`);
}).finally(() => {
console.log("処理を終了します");
});
次のコードを実行すると、「 B 」「 A 」という順で表示されます。
setTimeout(function(){
console.log("A");
}, 1000);
console.log("B");
次のpromise を使ったコードを実行すると、「 A 」「 B 」の順で表示されます。
let promise = new Promise((resolve, reject) => {
setTimeout(function(){
console.log("A");
resolve();
}, 1000);
});
promise.then(function(txt){
console.log("B");
});
次のコードは「 A A B 」の順で表示されます。
最初の then メソッドの戻り値を、promise インスタンスにし resolve の引数に値を設定すれば、次の then メソッドに値を渡せます。
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("A");
}, 2000);
});
promise.then((txt)=>{
console.log(txt);
let txt2 = txt;
return new Promise((resolve, reject) => {
resolve(txt2)
})
}).then((txt) => {
console.log(txt);
console.log("B");
})
引数に指定したすべてのPromiseを実行します。
async function fetchall() {
const promise1 = fetch('data.json').then((res) => res.json())
const promise2 = fetch('data2.json').then((res) => res.json())
const [res1, res2] = await Promise.all([promise1, promise2])
return [res1, res2]
}
fetchall()
.then(([a, b]) => {
for(let i of a){console.log(i)}
for(let j of b){console.log(j)}
})