1

プログラムをリファクタリングしようとしています。AJAX 呼び出しを同期化することで機能させていましたが、今は適切な方法で実行したいと考えています。起こっていることは、見出しのリストを含むheadline新しい見出しでインスタンス化されることです。既存のリストからランダムに見出しを選択しますが、リストが空の場合は、AJAX 呼び出しを行ってさらに見出しを取得します。headlinesheadlines.getRandom()

Headline2 つのオブジェクトを相互依存させずに、呼び出しが完了するまでオブジェクト コンストラクターを待機させる方法について、頭を悩ませることはできません。現状では、呼び出しが正常に完了していないために未定義のオブジェクトからインスタンス化しようとしているため、見出しはインスタンス化に失敗しています。

コールバックについては知っていますが、コールバックを使用して、多くのオブジェクト近親相姦に陥ることなく、あるオブジェクトが別のオブジェクトからの AJAX 呼び出しの成功を待機するようにするにはどうすればよいでしょうか?

headline = new Headline(headlines.getRandom(true));
fillHeadline();

詳細を確認したい場合は、コンテキスト内のコードを次に示します。 https://github.com/raddevon/onion-or-not/blob/true-ajax/js/js.js#L104

4

4 に答える 4

2

あなたがすでに言及したコールバックに加えて。deferredオブジェクトとを使用できますpromises。たとえば、jQuery.Deferred では

コールバックの代わりに deferred/promise を使用することには、いくつかの利点があります。

  • Promise はチェーンできます。たとえば、 jQuery.when() など、何かを実行する前に複数の Promise を待つことができます。コールバックを使用すると、もう少し面倒です。
  • たとえば、実際のデータを待っている間に初期デフォルト値を表示するなど、promise の状態を確認できます。
  • データのプロデューサーコンシューマーを分離する方が簡単です。Promise は手続き型/同期スタイルで (実際のデータであるかのように) 返され、渡されます。これは、実行パスをたどるのが難しいコールバックの複雑なチェーンを回避するのに役立ちます。
于 2013-05-21T20:09:30.363 に答える