下記の引用は、ブレイクスルーjavascript初版96頁に記述されているものを一部抜粋したものです。

〇Promise/Deferredを使った非同期通信
javascriptにおける非同期通信は、昨今のwebアプリケーションの進化を大きくけん引してきたといっても過言ではありません。しかし、その便利さとは裏腹に、非同期通信で受け取ったレスポンスをコールバックで処理するというシステムは時に複雑を極めます。
次のコードは、「asyncFuncA >asyncFuncB >asyncFuncCの順に、前回の非同期通信完了を待ってから実行する」という処理の例です。

asyncFuncA (function(a){
  asyncFuncB (function(b){
    asyncFuncC(function(c){
      console.log(c);
    },function(error){
      console.log(error);
    })
  },function(error){
    console.log(error);
  })
},function(error){
  console.log(error);
})

ここで疑問なのですが、書籍の言う前回の非同期通信というのは、ソース中のどれなのでしょうか。

試したソース

let asyncFuncA = function(qqq,eee) {
  //qqqは、入れ子になっているほうの関数
  qqq("asyncFuncA関数の仮引数であるqqq関数を実行");
  eee("asyncFuncA関数の仮引数であるeee関数を実行");
  console.log("qqq-a:",qqq,"eee-a:",eee);
};
let asyncFuncB = function(qqq,eee) {
  qqq("asyncFuncB関数の仮引数であるqqq関数を実行");
  eee("asyncFuncB関数の仮引数であるeee関数を実行");
  console.log("qqq-b:",qqq,"eee-b:",eee);
};
let asyncFuncC = function(qqq,eee) {
  qqq("asyncFuncC関数の仮引数であるqqq関数を実行");
  eee("asyncFuncC関数の仮引数であるeee関数を実行");
  console.log("qqq-c:",qqq,"eee-c:",eee);
};

asyncFuncA(function(a){
  console.log("実引数a",a);
  asyncFuncB(function(b){
    console.log("実引数b",b);
    asyncFuncC(function(c){
      console.log("実引数c",c);
    },function(error){
      console.log("実引数error-c",error);
    });
  },function(error){
    console.log("実引数-error-b",error);
  });
},function(error){
  console.log("実引数error-a",error);
});

`

https://teratail.com/questions/137033