2

jQueryモバイルWebサイトに設定ページがありますユーザーが[保存]ボタンをクリックすると、言語、通貨、しきい値の3つの異なるユーザー入力用にサーバーが更新されます

これを行うために、私は3つの別々のajax呼び出しを行います(PUTを使用)。したがって、すべてが成功したら、別のページに移動します。これらのいずれかが失敗した場合は、同じページにとどまり、エラーメッセージを表示します。

問題は、すべての呼び出しが成功した場合にのみページを切り替えたいことです。エラーがある場合は、すべてのメッセージ(3つの個別のアラートウィンドウではなく)で1つのアラートを表示したいので、これらすべての結果を待つ必要があります。呼び出します。

私が使用した3つのAjax呼び出しすべてでこれを達成するため。

async:false 

そして、これらすべての呼び出しにブール値を入れて、次のようなメソッドを成功させます。

     success: function (data){
           languageUpatesuccesful=true;

        }

そして、このようなもの。

 if(languageUpatesuccesful){
   make the next call to update currency..etc
}

..。

if(allsuccesful(){
  changepage();
}

したがって、1つの呼び出しがいつ終了したかを正確に追跡し、すべてが別のページに正常に切り替わった場合に次の呼び出しを行うことができます。

これは機能しますが、これは恐ろしい解決策だと思いますが、async:trueを使用してこれを達成する方法はありますか?

非同期ajacを無効にするとページがフリーズし、アニメーションも表示できないため、jQueryでは推奨されていません。しかし、これらの3つの呼び出しがいつ終了したかを知り、結果に応じてアクションを実行するにはどうすればよいでしょうか。

4

3 に答える 3

8

遅延オブジェクトを次のものと一緒に使用し$.whenます。

$.when(ajax1(), ajax2(), ajax3()).done(function() {
    // all Ajax calls successful, yay! 
}).fail(function() {
    // oh noes, at least one call failed!
});

は次ajaxXのように定義されます。

function ajax1() {
    return $.ajax(...);
}

Ajax 呼び出しを同時に実行するのではなく連鎖させたい場合は、Bergi のソリューションをご覧ください。

于 2013-01-29T15:57:32.817 に答える
4

Deferred インターフェイスを使用すると、簡単にチェーンできます。

$.ajax({…})
  .then(function(languageUpateResult) {
     return $.ajax({…});
  })
  .then(function(currencyUpdateResult) {
     return $.ajax({…});
  })
  .then(function(thresholdUpdateResult) {
     changePage();
  });

申し訳ありませんが、ajax 呼び出しが個別であるという事実をスキップしました。上記のコードは、それらを並行して実行し、それらすべてが使用を終了するのを待つだけの場合は、それらを順次実行します$.when()- @FelixKling's answerを参照してください。

于 2013-01-29T15:56:56.953 に答える
1

Web ワーカーを使用して、バックグラウンド スレッドで非同期呼び出しを行うことができます。Web ワーカーはブラウザのサポートが充実しており、問題を解決できるはずです。興味のある方は、Web ワーカー ライブラリーを簡単に操作できるように少し抽象化したものを書きました (私に pm を送ってください)。

于 2013-01-29T15:57:18.507 に答える