5

クライアント側で gwt を使用する場合、コールバック メソッドで処理を行う非同期メソッドを呼び出すという一般的な状況があります。

asyncService.method(new AbstractAsyncCallback<Number>() {
  @Override
  public void onSuccess(Number num) {
    // do something with number
  }
});

しかし、ある非同期メソッドから結果を取得したり、別の非同期メソッドに渡したりする必要がある状況に遭遇することがよくあります。

asyncService.method(new AbstractAsyncCallback<Number>() {
      @Override
      public void onSuccess(Number num) {
        asyncService.method1(num, new AbstractAsyncCallback<String>() {
          @Override
          public void onSuccess(String str) {
             asyncService.method2(str, new AbstractAsyncCallback<Void>() {
               @Override
               public void onSuccess(Void void) {
                 // do something
               }
             });
          }
        });
      }
    });

サーバー側でこの 3 つの呼び出しを組み合わせて、個別のサービス メソッドを作成できますが、このような異なるメソッドの組み合わせが多数必要な場合はどうすればよいでしょうか? 別の懸念は、既存のメソッドを単純に組み合わせることで取得できる機能を実行する別のメソッドを追加することです。

そのようなコードを取り除き、サーバー側のサービスを変更しない一般的なパターンはありますか?

4

3 に答える 3

2

呼び出しの連鎖という 1 つのパターンを概説しました。このパターンは、2 番目の呼び出しが最初の呼び出しの結果に依存する場合などにのみ使用する必要があります。

リクエストを並行して実行できる場合は、そうすべきです。1 つのオプションは、続行する前に他のメソッドが完了するのを待機するターゲット メソッドです。この例では、showPerson() は 2 回呼び出されますが、すべてのデータの準備が整ったときに 1 回だけ実行されます。

Integer age = null;
String name = null;

asyncService.method(new AbstractAsyncCallback<Integer>() {
    @Override
    public void onSuccess(Integer num) {
        age = num;
        showPerson();
    }
});
asyncService.method(new AbstractAsyncCallback<String>() {
    @Override
    public void onSuccess(String n) {
        name = n;
        showPerson();
    }
});

private void showPerson() {
    if (name != null && age != null) {
        myView.showPerson(name, age);
    }
}
于 2012-10-10T12:12:09.957 に答える
2

匿名クラスを使用する代わりに、名前付きクラスを作成できます。これにより、紛らわしい入れ子がなくなり、意味のある名前を使用すると、コードが理解しやすくなります。

于 2012-10-10T10:44:15.283 に答える
0

通常、匿名コールバックの実装で変数を定義することを好みます。これらの変数はコード内で同じレベルにあるため、読みやすくなり、ワークフローを理解するために並べ替える傾向があります。もう 1 つの目標は、これらのコールバックを再利用できるようにすることです。

  AsyncService asyncService = GWT.create(AsyncService.class);

  AsyncCallback<Number> onMethod1Response = new AbstractAsyncCallback<Number>() {
    public void onSuccess(Number num) {
      asyncService.method2(onMethod2Response);
    }
  };

  AsyncCallback<String> onMethod2Response = new AbstractAsyncCallback<String>() {
    public void onSuccess(String str) {
      // do something
    }
  };  

  asyncService.method1(onMethod1Response);
于 2012-10-11T05:43:13.827 に答える