開始する
Common JS Promisesの存在そのものは、長い間私に知られていました。 Angular.jsには、独自の約束/遅延実装があり、相互浸透へと私を押し進めました。 promiseに基づいたこれらのチェーンの実装で少し苦しんだ後、 promiseはこれを目的としていないことが明らかになりました。 そのため、
ビジネスへ
プログラムインターフェイスについて考える過程で、 hain.jsは5つの関数のリストを取得しました。1つのコンストラクターと4つのメソッドです。 圧縮された実装のサイズは2.03KBで、完全な(コメントなし^ _ ^)実装のサイズは3.15KBです。 これらのファイルは、 Chain.js専用に作成されたページでダウンロードできます。 直接的なリンクはありません、私はそれを破ることができるのではないかと心配しています。
インストールは簡単で、他のスクリプトと違いはありません。
<script src="js/chain.dev.js" type="text/javascript"></script>
その後、ライブラリは
Chain
という名前のグローバルスコープ(明らかに
window
)で利用可能になり
window
。
Chain
は、新しいチェーンの設計者であり、呼び出すための2つの主なオプションがあります(追加のオプションを自分で考えることができます)。
var testChain = Chain(); // var anotherChain = new Chain;
これで、チェーン
-
.then(Function | Array.<Function>)
-
.defer(Function | Array.<Function>)
-
.when(Chain | Array.<Chain>)
.then
メソッドは同期関数を受け入れ、
.defer
は非同期関数を
.when
、
.defer
.when
Chain
オブジェクトを
.when
ます。 3つのメソッドはすべて、呼び出された
Chain
オブジェクトを返します( jQueryチェーンのように)。 また、これらのメソッドは、1つの必須引数またはそのような引数の配列のいずれかを取ることができます。
.then
および
.defer
前のリンクの結果は、指定された関数の最初の引数によって次のリンクに渡されます。
チェーンは、最後のライブラリメソッドである
.end
メソッドが
.end
ときにのみ実行されます。
次の署名があります。
- .end([関数])
この関数は、チェーン内のすべての操作が完了すると呼び出されます。 関数の指定はオプションです。
理解のための例:
var calculate = Chain(); calculate. then(function() { // undefined return 0; }). then(function(result) { // , result 0 return result + 5; }). then(function(result) { // result 5 return result + 10; }). end(function(result) { console.log(result); }); // 15
同じ結果の別のレコード:
var calculate = new Chain; function zero() { return 0; } function plus5(num) { return num + 5; } function plus10(num) { return num + 10; } function log(result) { console.log(result); } calculate. then([zero, plus5, plus10]). end(log); // 15
同じことを非同期に行います。
var calculate = Chain(); calculate. defer(function(n, done) { // undefined, // - , done(0); }). defer(function(result, done) { // result 0 // setTimeout(function() { done(result + 5); }, 1000); }). defer(function(result, done) { // result 5 done(result + 10); }). end(function(result) { console.log(result); }); // 15
同じこと、異なる方法で:
var calculate = new Chain; function zero(n, done) { done(0); } function plus5(num, done) { setTimeout(function() { done(num + 5); }, 1000); } function plus10(num, done) { done(num + 10); } function log(result) { console.log(result); } calculate. defer([zero, plus5, plus10]). end(log); // 15
最後に、残りの回路を接続するために
.when
メソッドが使用されます。
.when
メソッドが
.when
後、前のチェーンリンクの実行結果を含む配列が次のリンクに
.when
れます。 例:
var five = Chain(), ten = Chain(); five.defer(function(n, done) { setTimeout(function() { done(5); }, 1000); }); ten. when(five). then(function(results) { return results[0] + 5; }); // results [5] Chain(). when([ten, five, ten]). end(function(results) { console.log(results); }); // [10, 5, 10]
仕事の特徴
.when
メソッドに渡されるチェーンは並行し
.when
実行されます。 結果の配列のシーケンスは、示された回路の接続(追加)のシーケンスに対応します。最後の例を参照してください。
チェーン実行の開始後に
.end
メソッドに転送されるすべての関数は、チェーンが完了するまで待機します。つまり、チェーンは2回起動されません。 最後の例の各関数に
console.log
を挿入すると、より明確になります。
チェーンの実行結果は保存され、
.end
メソッドが
.end
たびに返されますが、チェーンは開始されません。 実際、
.end
メソッドは2番目の引数を取り、チェーンを再び開始させることができますが、この動作は考慮されていません。 Chain.jsが好きなら 、私はこの振る舞いに対処することを約束します。
また、チェーン実行の中断は実装されていませんが、これは可能であり、簡単に実行可能です。
終わり
終わりですか? あなたのコメント、提案、願いを歓迎します。 ご清聴ありがとうございました。
更新。 他のライブラリのソリューションとの比較
Chain.jsが他のライブラリとどのように異なるかについての質問を含む3番目のコメントの後、黙っていることは不便になりました。 KeepYourMindに連絡し、 when.jsでの簡単なタスクの実装を支援するよう依頼しました。 KeepYourMindは支援することに同意し、すぐに提案された問題のおおよその解決策を示しました。 たとえば、次のタスクが提案されました:非同期に、目的のサービスのドメインを取得し、特定のアドレスへのリンクを生成し、このアドレスでデータを取得し、データをユーザーに表示します。 これを次のように大まかに示します。
- ドメイン名を取得->リンクを生成->データを取得->ユーザーに表示
その後、サンプルソリューションKeepYourMindをChain.jsに適合させました。 Github Gistコードリンク:
これで、例を自分で比較して、決定を下すことができます。 別のライブラリを使用してソリューションを追加する場合は、私に連絡してください。私はあなたを助けようとします。
また、 KeepYourMindとのコードの議論の中で、 Chain.jsを拡張してその
更新番号2。 継続
短い議論の続きで、 KeepYourMindとcan3pは、説明されているすべての機能がwhen.jsライブラリに既に存在することを私に説明しました。 したがって、 Chain.jsは単なる自転車であることを認めます。 ただし、この機能がPromises / Aで修正されていないことは事実です。
記事とリンクで提案されているソリューションの例が気に入ったら、 when.jsに精通することをお勧めします。 どうもありがとうございました。