質問: 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); }); ``` `
回答: 「asyncFuncA >asyncFuncB >asyncFuncCの順に、前回の非同期通信完了を待ってから実行する」というのは、もう少し詳しく書くと、「asyncFuncA >asyncFuncB >asyncFuncCの順に、asyncFuncAの非同期通信完了を待ってからasyncFuncBを実行し、asyncFuncBの非同期通信完了を待ってからasyncFuncCを実行する」という意味だと思います。 実際に動作する非同期関数のサンプルを`XMLHttpRequest`を使って書いてみます。 ``` function asyncFunc(url, callback, error) { var xmlHttp = new XMLHttpRequest(); xmlHttp.onload = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } }; xhr.onerror = function () { error(xhr.statusText); }; xmlHttp.open("GET", url, true); xmlHttp.send(null); } ``` それは、以下のように使います。 ``` asyncFunc(url, function(res1){ asyncFunc(url + '?id=' + res1.id, function(res2){ console.log(res2); },function(error){ console.log(error); }) },function(error){ console.log(error); }); ``` 質問のように3つ重ねるのは面倒なので2つにしておきました。