async / awaitは、ECMAScript7が非同期の問題を解決するために提案したソリューションで、ES6の約束よりも明確で使いやすいものです。
使用法:
- JavaScript
async
で関数の前にキーワードを追加すると、この関数の戻り結果がPromiseオブジェクトになります。 - awaitは非同期関数に配置する必要があります
- awaitの後に関数を接続して、この関数の実行が完了するのを待ちます。この関数がPromiseを返す場合、実行を続ける前に、この関数で非同期結果の実行(resolve())が完了するのを待ちます。関数のコードは、非同期の結果があるかどうかに関係なく、実行後に戻ります。
例:async / awaitとpromiseを併用
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1 = await read('1.txt');
let a2 = await read('2.txt');
let a3 = await read('3.txt');
console.log(a1.toString());
console.log(a2.toString());
console.log(a3.toString());
}
readByAsync();
注: awaitステートメントの後のPromiseオブジェクトがreject状態になると、async関数全体が中断され、後続のプログラムは実行されなくなるため、try ... catchを介して処理する必要があります。
const fs = require("fs");
const read = function(fileName){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if (err) {
reject(err);
} else{
resolve(data);
}
});
});
};
async function readByAsync(){
let a1;
let a2;
let a3;
try{
a1 = await read('1.txt');
a2 = await read('2.txt');
a3 = await read('3.txt');
}catch(e){
//TODO handle the exception
}
console.log(a1);
console.log(a2);
console.log(a3);
}
readByAsync();