>>918のasync関数fooは以下のように機械的に通常関数fooへと自動変換できる
ステートマシンを使う必要はない

function foo() {
 return new Promise((resolve, reject) => {
  console.log("hello");
  delay(1).then((_x1) => {
   let a = _x1;
   delay(2).then((_x2) => {
    let b = _x2;
    let c = a + b;
    console.log(`${a} + ${b} = ${c}`);
    resolve(c);
   });
  });
 });
}