非同期プログラミングの最高の境界は、非同期ではないかということにまったく関心を持たないことです.(メモ)


async関数は何ですか?一言で言うと、async関数はGenerator関数の文法飴です.
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);
}