同期コードと非同期コードの違いを理解する必要があります。
同期コードでは、実行するすべてのステートメントが評価され、その結果が返されます。現在のステートメントの評価が終了するまで、他のステートメントは評価されません。そのため、ステートメントは常に順番に評価されます。
var a = syncStatement1();
var b = syncStatement2();
console.log("finished!!!");
上記のコードでは、syncStatement2()
前に評価されることはありませんsyncStatement1()
。そしてログは「終了しました!!!」前の 2 つの関数内のすべてのコードが完了したときにのみ出力されます。
ただし、非同期コードでは、実行の順序が異なります。非同期ステートメントを評価するように要求すると、実行エンジンは単純に後で評価するようにスケジュールし、プログラムの実行を続行します。
var a = asyncStatement1();
var b = asyncStatement2();
console.log("finished???");
上記の 2 番目の例では、実行エンジンは、すべてのステートメント関数が評価されるのを待たずに、次のステートメントを実行します。「finished???」というログ行に到達するまでに 前の関数の実行が完了したことを確認できません。
実行中のエンジンは単にそれらを実行するようにスケジュールし、ある時点でそれらを実行し、返されたものを「返す」ようにしますが、最初にそれらを呼び出したときはそうではありませんでした。
これにはいくつかの意味があります。1 つ目は、非同期関数の結果を求めることができないということa = asyncFunc()
ですa
。まだ結果が得られていないため、おそらく未定義です。ただし、非同期関数の作成方法によっては、Promise オブジェクトが返される場合があります。これを使用して、非同期アクションをキャンセルしたり、結果が利用可能かどうかを後で確認したりすることもできます。
2 番目の意味は、コードは後で実行されるため、コンテキスト内ではまったく制御できないため、何が起こったかを知る唯一の方法は、関数自体に結果を通知するように依頼することであり、それが強制される理由です。次のように、コールバックを非同期関数に登録します。
function asyncFunc(args, success, error) {
//do something here
if(success) success(data);
}
これを回避して、コードが実際に同期モードで実行されているふりをする方法はありません。考え方を変えることを余儀なくされています。
上で述べたように、使用しているフレームワークによっては、非同期関数から約束を取得し、次のように少し見栄えを良くするために少し変更する場合があります。
var promise = asynchFunc(args);
promise.success(function(data) {
//do something with data when successful in async.
});
promise.error(function(error){
//handle the error that happened in async.
});
console.log("Most likely not finished yet!!!");
ただし、これはまだ非同期実行であり、ログに到達するまでには、まだコールバックを処理していない可能性があります。
asyncのような一部のサード パーティ ライブラリを使用すると、この種のコードを扱う際の作業が少し簡単になります。
最後に、あなたの質問に答えるために、これを行うことはできません
var dao = new DAO();
var <DATA> = dao.getData(var1, var2, callbackSuccess, callbackError);
しかし、これを行うことができます:
var <DATA> = null;
function onSuccess(data){
//act on your data and update controller
<DATA> = data;
}
function onError(error){
//handle error
}
dao.getData(var1, var2, onSuccess, onError);