私は現在jquery.deferredパターンを使用して自分のウェブサイト用の簡単なライトボックスを構築していますが、その間に非同期操作のフラットチェーンを維持し、悪名高いネストされたコールバックピラミッドの運命。jquery - 遅延チェーンを介して変数を渡してネストを避ける
$('#gallery a').click(function() {
var id = $(this).attr('id'); // Id of the current selection
var current = 0; // Array index of the current item
getTpl() // Get and load lightbox template
.then(getData) // Get JSON data of the selected item
.then(getItem) // Pass JSON data and get the item
.then(loadItem) // Use JSON data to create the HTML output
.done(function() {
// Wrap everything up, intialize the lightbox controls
// (requires the JSON data) and load the lightbox
});
});
最初の2つのステップ(getTpl、のgetData)は、単純なAJAXの約束や仕事の罰金です:ここでは私がこれまで持っているものです。さらにJSONデータをチェーンの3番目のステップ(getItem)に渡すこともできます。
- 私はチェーン(のgetItemとloadItem URLを構築するためにこれらの変数を使用して作成時に呼び出される関数への高い範囲から変数「ID」と「現在」を渡すことがあります。それは問題が起動ところですHTML出力)。非同期チェーンを壊すことなく、どうすればいいですか?
- JSONデータ(およびその他の変数)は、実際にチェーンを使用する方法に沿ってすべての関数から返さなければなりませんか?データと必要な変数をチェーン全体で利用できるようにする簡単な方法はありませんか?
- ランダムな操作をチェーンにスローすることはできますか?シンプルなjqueryフェードイン?それは、 '.done'が新しい約束を期待しているからです。
ありがとうございます!あなたはこのようにそれを行う場合
私はすでに覚えて/考え出しあなたの関数がインラインである場合、それらは直接範囲内で一部の変数にアクセスすることができます変数を保持しているオブジェクトを宣言するだけで、チェーンを介して変数を追加することができます。愚かな私! 操作を別々の関数に分割する理由は、これらの操作を別の場所から呼び出すことができ、コンテキストに応じてチェーンが変更される可能性がある(チェーンにランダムメソッドを投げた場合)。別々の機能を持ち、状況に応じて必要に応じてそれらを連鎖させるのがよい方法だと思った。これを処理するスマートな方法があれば、教えてください。 – sverebom
@ user3330116 - 私はあなたにすでに3つの別々のアプローチを提案しました。私は個人的には、最も柔軟性の高いオプションオブジェクトを選択するでしょう。各関数は、この環境で使用できる、または別々に呼び出されたときに、そのオブジェクトに対して必要な/期待されるプロパティを持ちます。しかし、チェーン化するときに他のプロパティを渡す柔軟性が得られます。 – jfriend00
これは私が今やったことですが、それは魅力のように機能します。 「チェーンを通してオブジェクトを渡す」というアプローチが鍵でした。清潔でシンプル。 JSでのオブジェクトの一般的な使用とPromisesのワークフローに関する追加情報を思い出してくれてありがとう。 – sverebom