非同期プログラミングの最高の境界は、非同期ではないかということにまったく関心を持たないことです.(メモ)
2704 ワード
async関数は何ですか?一言で言うと、async関数はGenerator関数の文法飴です.
Generator関数があります.二つのファイルを順次読みます.
https://segmentfault.com/a/11...詳しくは辺境城の大人の徹底した解説です.
注意点
awaitコマンドの後のPromiseオブジェクトは、運転結果がrejectdかもしれませんので、awaitコマンドをtry...catchコードブロックに入れたほうがいいです.
Generator関数があります.二つのファイルを順次読みます.
var fs = require('fs');
var readFile = function (fileName){
return new Promise(function (resolve, reject){
fs.readFile(fileName, function(error, data){
if (error) reject(error);
resolve(data);
});
});
};
var gen = function* (){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
async関数として書いたら、次のようになります.var asyncReadFile = async function (){
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
,async Generator (*) async, yield await, 。
http://www.ruanyifeng.com/blo...上の段は阮一峰先生の説明です.https://segmentfault.com/a/11...詳しくは辺境城の大人の徹底した解説です.
注意点
awaitコマンドの後のPromiseオブジェクトは、運転結果がrejectdかもしれませんので、awaitコマンドをtry...catchコードブロックに入れたほうがいいです.
async function myFunction() {
try {
await somethingThatReturnsAPromise();
} catch (err) {
console.log(err);
}
}
//
async function myFunction() {
await somethingThatReturnsAPromise().catch(function (err){
console.log(err);
});
}
await命令はasync関数でしか使えません.普通の関数で使うと、エラーが発生します.
async function dbFuc(db) {
let docs = [{}, {}, {}];
//
docs.forEach(function (doc) {
await db.post(doc);
});
}
上のコードは誤報されます.awaitは普通の関数に使われています.ただし、forEachメソッドのパラメータをasync関数に変更すると問題があります.
async function dbFuc(db) {
let docs = [{}, {}, {}];
//
docs.forEach(async function (doc) {
await db.post(doc);
});
}
上のコードは正常に動作しないかもしれません.この時の3つのdb.post操作は同時に実行されます.つまり同時に実行されます.正しい書き方はforループを採用します.
async function dbFuc(db) {
let docs = [{}, {}, {}];
for (let doc of docs) {
await db.post(doc);
}
}
複数のリクエストを同時に実行したい場合は、Promise.allメソッドを使用することができます.
async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc));
let results = await Promise.all(promises);
console.log(results);
}
//
async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc));
let results = [];
for (let promise of promises) {
results.push(await promise);
}
console.log(results);
}