2011-09-01 10 views
0

私は現在、restfullサービスからのデータにアクセスするために多くのajaxリクエストを使用するプロジェクトに取り組んでいます。一部の操作では、複数の順次呼び出しが必要です。私がこれらの最初のものを実装するとすぐに、私は競合状態に遭遇しました。 (ajaxCall_1を呼び出し、ajaxCall_1の結果を使用するが、ajaxCall_1はまだ戻っていない)。もちろん、私は.successプロパティを使うことができますが、それは私のためのトリックをしません。下の簡単な例で説明しましょう。私は含む.jsファイルを持っている:JQuery Promise question

function getServerBoolean(){ 
    $.get('url_1',function(data){return data)}); 
} 

function refreshWidget(){ 
    $.get('url_2',function(data){ 
     var serverBoolean = getServerBoolean(); 
     --do some html building here based on boolean returned from server-- } 
    ); 
} 

function setServerValue(newValue){ 
    $.post('url',{key:newValue},function(data){ 
     // server model has changed, so refresh widget. 
     refreshWidget(); 
    }); 

} 

私は(「someValueの」)setServerValeuを呼び出すたびに、ウィジェットが自身をリフレッシュする必要がありますが、これを行う前に、サーバーブール値を知る必要があります。このように私はより多くのsiutationsを持っているので、単にメソッドの引数としてコールバックを与えてから、それを.success()で呼び出すことは私のトリックをしません。

私は$ .when $ .then $ .doneメソッドを見つけましたが、自分の状況でこれらのメソッドを使用する方法がわかりません。これを設定する方法を手伝ってくれる人がいますか?

ありがとうございます!

リチャード

+0

なぜ、.success()を使用してajaxCall_2を含む関数を呼び出すことができないのですか? –

+0

私はサーバーへの多くのrest/ajax呼び出しを含むapiを持っています。これらのメソッドでコールバックを使用する場合は、コールバックで多数のネストされたコールが終了することになりますが、これはコードのメンテナンスのために必要なものではありません。その次に、コールバック関数をパラメータとして許可するようにすべてのメソッドを変更する必要があります。これもまた私が望むものではありません。apiを可能な限りきれいに保ちたいです。 $ .when()。これを完全に行います。 (それは私の魅力のように働く) – Bjarne77

答えて

1

私は$行って、約$ .when $を知らないが、これを行うための機能的な方法は、コールバックを周りに渡すことであろう。それはそのようになります。もちろん

function getServerBoolean(dataCallback){ 
    $.get('url_1', dataCallback); 
} 

function refreshWidget(){ 
    $.get('url_2',function(data){ 
     getServerBoolean(function(boolValueReturned) { 
      //do something with the value 
     }); 
    }); 
} 

を我々が得た引数は関数であり、いくつかのデフォルトのコールバックにそれを設定されていない場合場合(getServerBooleanに)チェック例えばのように、これを微調整するための多数の方法があるかもしれません。

+0

これはいいようです。私はこれを試してみましょう。私は少しこれが(私の場合)最終的に多くのネストされたメソッド/コールバックに終わってしまうのではないかと心配しています。私は$ .when()を期待していましたが、そのアプローチは起こるのを避けるでしょう。 – Bjarne77

+0

それはとにかくきれいなアプローチです。私はjQueryのドキュメンテーションの$ .when記述と基本的には同じことをチェックしました。他のコールバックが実行された後に実行されるコールバックを渡します。コールバックの大部分(すべてではないにしても)が名前付き関数として定義されていれば、コードを複雑にするべきではありません。そして、コールバック関数を必要な順序で渡す関数またはフローを定義するだけです。 – WTK

+0

という名前の関数...それはvarに関数を割り当てるのでしょうか?そして.call()メソッドを使用しますか? – Bjarne77