コールバックからPromiseまで非同期関数(async await)


promiseがJavaScript言語に加入される前に、非同期コードは一般的にフィードバックに基づくAPIを使用し、特にNode.jsにおいて使用される.これは一例です.
function handler(done) {
  validateParams((error) => {
    if (error) return done(error);
    dbQuery((error, dbResults) => {
      if (error) return done(error);
      serviceCall(dbResults, (error, serviceResults) => {
        console.log(result);
        done(error, serviceResults);
      });
    });
  });
}
入れ子が深くなると、コードが読みにくくなり、維持が困難になるので、このモードを「リセット地獄」と呼びます.
幸いなことに、プロミスはJavaScript言語の一部になりました.同じコードはより優雅でメンテナンス可能な方法で作成できます.
function handler() {
  return validateParams()
    .then(dbQuery)
    .then(serviceCall)
    .then(result => {
      console.log(result);
      return result;
    });
}
最近、JavaScriptは非同期関数をサポートし始めました.同期コードと非常に類似した方法で上記の非同期コードを作成することができます.
async function handler() {
  await validateParams();
  const dbResults = await dbQuery();
  const results = await serviceCall(dbResults);
  console.log(results);
  return results;
}
非同期関数を使用すると、コードがよりシンプルになり、データストリームはより制御しやすくなり、実行は非同期であるにもかかわらず、非同期である.(JavaScript実行はまだスレッド内で行われています.これは、非同期関数自体が実際の物理スレッドを作成しないことを意味します.)