JavaScript非同期呼び出しフレームを書く(Part 5-チェーン実装)

2859 ワード

前の記事では、非同期呼出の枠組みのために、非同期呼出行列のコードの読み取り可能性を強化するためのチェーン呼び出し方式を設計しました.この部分の機能を実現するコードを作成します.
入り口を呼び出す
チェーンコールは、Aync.go方法とAync.chain方法の両方の入口が存在しますが、この2つの入り口は本質的には一致しています.ただし、Aync.chain方法は呼び出し時に初期パラメータを提供しないで、Aync.go方法は呼び出し時に初期パラメータを提供し、非同期呼出チェーンを起動します.Async.chain = function() {
  var chain = new Async.Operation({ chain: true });
  return chain;
};

Async.go = function(initialArgument) {
  return Async.chain().go(initialArgument);
}
ここでは、チェーン呼び出し自体もAsync.Operationであり、チェーン呼び出しに必要なgo方法とnext方法はいずれもAsync.Operationの上に拡張されており、この拡張は難しくないということが分かります.これは次のセクションで説明されます.
拡張方法
addCallback法によって追加されたコールバック関数は、少なくとも同期関数が1つずつ実行されることを知っていますので、Async.Operationのこの特性を使って、非同期のキューを呼び出すことができます.
非同期の呼び出しに対してキューのサポートを行います.後で処理します.まず既存のaddCallback方法とyield方法を利用してgo方法とnext方法を拡張します.this.go = function(initialArgument) {
  return this.yield(initialArgument);
}

this.next = function(nextFunction) {
  return this.addCallback(nextFunction);
};
実際、goメソッドとnextメソッドが直接呼び出されたのは、yield方法とaddCallback方法です.go方法の意味は、yield方法と同様に、Aync.Operationのインスタンスにパラメータを伝達し、キューを起動する.また、nextメソッドの意味とaddCallback方法は、列の端に呼び出されるものを追加します.
非同期行列
同期だけをサポートしていたキューが、どうすれば非同期をサポートすることができますか?これはキューの呼出ごとの戻りを検出する必要があります.戻りのタイプがAsync.Operationであれば、非同期呼出であることを知っています.これによって、特別な方法を使用して、実行後に実行します.callbackResult = callback(self.result);
self.result = callbackResult;
if (callbackResult && callbackResult instanceof Async.Operation) {
  innerChain = Async.chain();
  while (callbackQueue.length > 0) {
    innerChain.next(callbackQueue.shift());
  }
  innerChain.next(function(result) {
    self.result = result;
    self.state = "completed";
    self.completed = true;
    return result;
  });
  callbackResult.addCallback(function(result) {
    self.result = result;
    innerChain.go(result);
  });
}
呼び出しがAsync.Operationの例に戻ったら、私たちは自分のaddCallbackの方法を利用してキューの中の残りの呼び出しを実行してくれます.正確には、我々は新しい呼び出しチェーンを構築し、残りの呼び出しを新しい呼び出しチェーンに移行し、現在の非同期呼び出しをコールバックで起動させます.
また、いくつかの場所がありますが、新しい非同期対応のための列を呼び出すためには、簡単に変更する必要があります.例えば、result、state、complettedの状態変更は、チェーンコールでは異なります.
結び目
既存のAsync.Operationでは、非同期的なキューの呼び出しをサポートしています.完全なコードはここを見てください.
今はもう一つの機能が強いAsync.Operationを持っています.これからはどうやってもっと多くの一般的な利用パターンに投入するかを見てみます.もしあなたが関連の議論を逃したくないなら、私のブログを購読してください.
  • チェーンコールに対応する非同期呼び出しフレームのAync.Operation(Cat in dotNET)
  • feed(Cat in Chinese)