0

私の Web サイトは ajax の投稿を Web サービスに送信しています。Web サービスはその代わりに json を返し、その json は成功のコールバックでさらに使用されます。

ここに私の問題があります。私の Web サイトが複数の ajax 投稿を送信している場合、Web サービスが返した json がごちゃごちゃになっているようです。

ajax 投稿または Web サービス (REST) のいずれかを同期することを考えていますか? REST サービスを同期する必要はないと読みましたが、本当ですか? 同期が解決策である場合、どこで同期すればよいですか? ajax で async: false は投稿を同期しますか?

ありがとう。

いくつかのコードを含めることを考えました:

ウェブサービス:

@POST
@Override
@Produces("application/json")
@Consumes("application/json")
public Customer create(Customer cust){
    custManager.save(cust);
    return custManager.getCust(custManager.getCount());
}

AJAX:

$.ajax({
  url:  custURL,
  type: 'POST',
  data: JSON.stringify(sdata),
  dataType: 'json',
  contentType: 'application/json; charset=utf-8',
  success: function(json){
     var cust = JSON.parse(JSON.stringify(json));
     var newId = cust.id;
     updateCustId(oldId, newId);
  }
});

それが行うことは、顧客のデータをWebサービスに投稿し、WebサービスがIDを指定し、それをクライアントに返して顧客IDを更新することです。それだけではありません。古い顧客 ID を参照する他のテーブルも、サーバーから生成された新しいものに更新しています。これらの他のテーブルを更新した後、Web サービスにも送信されます。私が話しているテーブルは web sql であり、そのクエリも非同期で動作します。そのため、ID がごちゃ混ぜになり、他のテーブルが Web サービスに送信されることがありますが、それが使用する customerid は古いもののままです (コールバックを使用して、送信する前に最初に更新する必要があることを確認しました)。サーバーに)。

私のajax呼び出しを async: false にして、それらを同期させ、ごちゃ混ぜにならないようにします。

4

1 に答える 1

1

具体的には、あなたの問題は非同期性ではないと思います。Web サービスの実装にバグがあるようです。あなたが説明したものはうまくいくはずです。

複数の Ajax リクエストは完全に独立しています。バックエンド サーバーは、各リクエストを個別に処理する必要があります。

Web アプリケーションのスレッド間でデータを共有すると、同じデータへの同時アクセスで問題が発生することがあります。もしそうなら、これが修正すべき点であり、(最悪の場合)、クロスコンタミネーションを行っているほんの小さなコードの周りにミューテックスを置きます.

データがサーバーから問題なく送信されていることがわかったが、アプリケーションでデータが破損している場合は、そこにバグがあります。

アプリ全体を同期化することで、重大なバックエンド バグのように見えるものを隠そうとしないことを強くお勧めします。根底にある破損の問題を修正します。その問題がスレッドセーフにできないことが原因である場合は、その小さなビットだけをロックします。

REST に関するあなたの質問は少し関係ありません。コードを同期する必要があるかどうかに関係なく、REST サービスと他のアーキテクチャは変わりません。Ajax を使用する場合、非同期でステートレスであることを意図した HTTP プロトコルを使用していることになります。私の見解では、クライアントによる同期アクセスを必要とするあらゆるスタイルの Web アプリケーションは、何か問題があることを示す大きな危険信号です。

その一般的なアドバイスを超えて、詳細について特定のコードベースの質問をする必要があります。

于 2012-07-16T14:31:44.660 に答える