JavaScript非同期呼び出しフレーム(Part 2-用例設計)

2808 ワード

コールバック
私たちがまず考えるべき問題は、どのようにフィードバックの入り口を伝達するかです.最も伝統的なXHR呼び出しでは、コールバック関数は最後のパラメータとして非同期関数に伝達されます.
 
  
function asyncOperation(argument, callback)
パラメータがかなり多いときは、パラメータをJSONの中に置くことができます.このようにパラメータは有名なパラメータと同じように、パラメータ名を介して選択的にパラメータを伝えることができます.渡さないパラメータは標準値を使うのと同じです.これはPrototypeから流行してきたやり方です.
 
  
function asyncOperation(argument, options)
しかし、これらの2つのアプローチは、同期関数を非同期関数(または同期非同期非同期ハイブリッド関数)に変更する際に、関数署名を明示的に変更し、最後に一つ(または複数)のパラメータを追加するデメリットがある.
スタックを呼び出した下の階に非同期関数を導入するのは私たちにとってよくあることです.このためには、関数の署名を変更するための大量のコストが高すぎるかもしれません.だから、関数の署名を変更する必要がない方法を考えましょう.
ここで参考にしました.NET FraamewarkのIAsyncResoultデザインは、非同期操作に関するすべての情報を一つのオブジェクトに集めてきて、関数に対する署名の修正を避けました.ここでは、非同期関数の呼び出しのプロトタイプを仮定します.
 
  
function asyncOperation(argument) {
operation = new Async.Operation();
setTimeout(function() { operation.yield("hello world"); }, 1000);
return operation;
}
このコードでは、将来のコールバック関数を伝達するためのOperationオブジェクトを返します.同時に、私達はsetTimeoutを通じて非同期リターンの結果をシミュレーションしましたが、具体的な戻り方はyield方法です.
次に,伝達コールバック関数を設計する方法もある.私たちはC((zhi)のように演算子を重み付けすることができませんので、関数で回転関数を伝えるしかありません.
 
  
var operation = asyncOperation(argument);
operation.addCallback(function(result) { alert(result); });
C〓〓の中でこのような設計をするのは安全ではありませんて、非同期の操作が回転を添加する前に完成するかもしれないためです.しかし、JavaScriptの中でこのように書くのは安全です.JavaScriptは単一スレッドのため、asyncOperationの同期addcallbackは必ず先に実行します.asyncOperationの中の非同期yieldは必然的に後で実行します.
呼び出し順序
もしユーザが同期方式でyieldを呼び出すと、その時の実行順序はyieldの実現に依存しませんか?はい、でもyeildはフレームの中で一回で実現されます.私達はそれを非同期的なものにすればいいです.これで同期呼出しをしても、実行順序に影響がありません.
 
  
function psudoAsyncOperation(argument) {
operation = new Async.Operation();
operation.yield("hello world");
return operation;
}
var operation = asyncOperation(argument);
operation.addCallback(function(result) { alert(result); });
コードをこのように書いても、addCallbackがyieldの実際の論理より先に実行することを確保できます.
事後へんこう
場合によっては、フレームの使用者は本当に先yield後のaddCallbackのコードを書いたかもしれません.この時、addCallbackに追加されたコールバック関数がすぐにトリガされることを保証しなければならないと思います.ユーザがこのコールバック関数を追加することは、非同期動作が結果があるときにこのコールバック関数に通知することを期待していることを意味し、これはコールバック関数を追加するときに非同期動作が完了するかどうかに関係ない.そのために、もう一つの用例を追加します.
 
  
function psudoAsyncOperation(argument) {
operation = new Async.Operation();
operation.yield("hello world");
return operation;
}
var operation = asyncOperation(argument);
setTimeout(function() {
operation.addCallback(function(result) { alert(result); });
}, 1000);
結び目
ここに来て、Async.Operationという非同期的な操作対象を設計しました.具体的にどのように重要なyield方法とaddCallback方法を実現するかは次の文章で述べます.