2

たくさんのユーザーグループを含むソフトウェアを管理しています。管理者がグループのユーザーの[削除]をクリックすると、次の2つのことが発生します。

  1. グループメンバーを削除します(キャッシュ、データベースなどの更新を含みます)
  2. グループメンバーのリストをリロードします(ユーザーがユーザーを削除すると、ユーザーにはこのリストが表示されます)

#2は#1の前に終了することが判明しました-競合状態。結果として、#1が成功するまで#2が実行されないように、コールバックを追加したいと思います。

このコードは、GWTが#1の前に#2が発生することを保証するために受け入れられますか?

 doTask1();

 GWT.runAsync(new RunAsyncCallback()
 {
   public void onFailure(final Throwable reason)
   {
   }

   public void onSuccess()
   {                       
     doTask2();
   }
 });
4

2 に答える 2

3

GWT#runAsync()GWTの「コード分割」機能に使用されます。これにより、必要になるまでコード(およびその他のランタイムリソース)の読み込みを延期できます。GWTの非同期操作パターン(つまり、 AsyncCallbackまたはCommanddoTask1() )を使用して、そこで非同期操作が完了すると呼び出されるコールバックを渡す必要があります。たとえば、 GWTRPCメソッドdoTask1()を実行する場合:

public void doTask1(final Command onCompletion) {
  myRpcService.doTask1(new AsyncCallback<Void>() {
    @Override
    public void onFailure(Throwable caught) {
      // Error handling
    }

    @Override
    public void onSuccess(Void ignored) {
      onCompletion.execute();
    }
  });
}

public void doTask2() {
  // Perform task 2
}

public void doTasks1And2() {
  doTask1(new Command() {
    @Override
    public void execute() {
      doTask2();
    }
  });
}
于 2012-10-19T23:24:16.667 に答える
0

いいえ、そのスタイルの制御フローで競合状態を維持できます。代わりに、次のようなものが必要です。

doTask1(new MyCallback() {
    public void onTask1Complete() {
       doTask2();
    }
}

doTask1()コールバックを受け入れる必要があります。これにより、コールバックが完了すると、次の操作が実行されます。

doTask1()理由を理解するために、とが両方ともdoTask2()HTTP呼び出しを行っていると仮定しましょう。doTask1()の要求が返されるまで待たない限り、サーバーがこれら2つの接続を受信する順序は保証されません。サンプルコードでは、でリクエストを行いdoTask1()(リクエストが非同期で行われるとすぐに戻ります)、最初の呼び出しを待たずに2番目の呼び出しを行います。

于 2012-10-19T23:33:03.420 に答える