0

以下のコードでは、インクリメンタル コマンドが期待どおりに機能していません。以下のラジオ ボタンを選択すると、製品の txt ボックスから値が取得され、RPC が実行されます。出力に基づいて、where 句を作成し、結果のクエリを実行したいと思います。

以下のクラス変数があります

private static boolean isLoaded = false;

StringBuilder whereClause = new StringBuilder("select * from grocery_shop where ");

StringBuilder productCode = new StringBuilder("(");

ArrayList<String> productList = null;

以下のコードは、インクリメンタル コマンドで RPC が呼び出される場所です。

    if (Dialog.getRadioproduct().getValue()) {
        DeferredCommand.addCommand(new IncrementalCommand() {

            @Override
            public boolean execute() {
                if (isLoaded) {
                    ProductServiceAsync Service =
                            ServiceFactory.getService(ProductReportService.class);
                    Service.getBasicProducts(Dialog.getTxtProduct().getValue(),
                        new AsyncCallback<ArrayList<String>>() {

                            @Override
                            public void onServiceFailure(Throwable ex) {
                                showError("Error");
                            }

                            @Override
                            public void onServiceSuccess(ArrayList<String> result) {
                                productList = result;
                                while(productList.iterator.hasnext())
                                    whereClause.append(" AND PROD = '" + productList.iterator.next() + "'");
                                isLoaded = true;
                            }
                        });
                    return false;
                }
                return true;
            }
        });
    }

上記のRPCが成功した後にこの実行クエリを実行したかったのですが、以下の行はRPCの前に実行されます。

    ResultSet rs = stmt.executeQuery(whereClause);

見逃したものがある場合はお知らせください。

4

1 に答える 1

0

まあIncrementalCommand、廃止されました。今、あなたは使用する必要があります:Scheduler.RepeatingCommandまたはScheduler.scheduleIncremental()

それとは別に、RPCは非同期であるため(新しいスレッドがその部分で開始される)、成功の回答の前にクエリが実行されるのは正常onServiceSuccessですonServiceFailure。あなたの要件)。

その他のオプションは、GQuery に実装されている Promises パターンを使用することです。doTheRPC(...).done(...).always(...); のようなもの (ただし、GWT の経験があまりない場合は、上記で説明した最も簡単な解決策を参照してください)。

于 2013-07-24T17:00:30.880 に答える