[UPD] Chain.js:同期および非同期関数をチェーンで接続します

Chain.jsは、同期および非同期関数のチェーンを作成するために作成された小さなライブラリです。 チェーンのアイデアは、 Common JS Promisesとの出会いの後に生まれました。 「約束」のまさに定義は、 約束が1つの操作の価値であると言います。 何かを発明、発明、または作成したい場合は、これらの操作を連鎖させようとするだけです。 もちろん、義務はありません。これは当然ですが、私にとってはそれが主な動機となっています。 その前に、私は本当に約束操作の束縛のいくつかの不便に遭遇しました、しかし、私は彼らがこれで私を助けると思っていました。

開始する


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 )で利用可能になりwindowChainは、新しいチェーンの設計者であり、呼び出すための2つの主なオプションがあります(追加のオプションを自分で考えることができます)。

 var testChain = Chain(); //  var anotherChain = new Chain; 

これで、チェーン作成するすべての力を感じることができます。これには、3つの方法があります。

.thenメソッドは同期関数を受け入れ、 .deferは非同期関数を.when.defer .when Chainオブジェクトを.whenます。 3つのメソッドはすべて、呼び出されたChainオブジェクトを返します( jQueryチェーンのように)。 また、これらのメソッドは、1つの必須引数またはそのような引数の配列のいずれかを取ることができます。 .thenおよび.defer前のリンクの結果は、指定された関数の最初の引数によって次のリンクに渡されます。
チェーンは、最後のライブラリメソッドである.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は支援することに同意し、すぐに提案された問題のおおよその解決策を示しました。 たとえば、次のタスクが提案されました:非同期に、目的のサービスのドメインを取得し、特定のアドレスへのリンクを生成し、このアドレスでデータを取得し、データをユーザーに表示します。 これを次のように大まかに示します。

その後、サンプルソリューションKeepYourMindChain.jsに適合させました。 Github Gistコードリンク:

これで、例を自分で比較して、決定を下すことができます。 別のライブラリを使用してソリューションを追加する場合は、私に連絡してください。私はあなたを助けようとします。

また、 KeepYourMindとのコードの議論の中で、 Chain.jsを拡張してそのようなソリューションを使用できるようにするというアイデアが生まれました。 ご清聴ありがとうございました。

更新番号2。 継続


短い議論の続きで、 KeepYourMindcan3pは、説明されているすべての機能がwhen.jsライブラリに既に存在することを私に説明しました。 したがって、 Chain.jsは単なる自転車であることを認めます。 ただし、この機能がPromises / Aで修正されていないことは事実です

記事とリンクで提案されているソリューションの例が気に入ったら、 when.jsに精通することをお勧めします。 どうもありがとうございました。

Source: https://habr.com/ru/post/J195588/


All Articles