0

このソースコードを使用して、GWT プロジェクトで U2F トークンから応答を取得しようとしています:

public class Test implements EntryPoint {

    @Override
    public void onModuleLoad() {
         Window.alert("Alert 3:"+u2FTest());
    }

    public static native String u2FTest()/*-{
    var respond = {rep: "Clear"};
    var RegistrationData = {"challenge":"dG7vN-E440ZnJaKQ7Ynq8AemLHziJfKrBpIBi5OET_0",
                            "appId":"https://localhost:8443",
                            "version":"U2F_V2"};
 $wnd.u2f.register([RegistrationData], [],
  function(data) {if(data.errorCode) {
        alert("U2F failed with error: " + data.errorCode);
        return;
    }

    respond.rep=JSON.stringify(data);
    alert("Alert 1: "+respond.rep); 
});
 alert("Alert 2: "+respond.rep);
 return respond.rep;
}-*/;

}

いくつかの理由で、次のようなアラートが表示されます。

  1. (アラート 2) 最初に「クリア」結果
  2. (アラート 3) 「クリア」で
  3. (アラート 1) Token 応答あり

通常、トークン応答で (アラート 1) を取得し、次に 2,3 を取得する必要があります。では、トークンの応答が得られるまで実行を停止するにはどうすればよいでしょうか。ありがとうございます。

4

1 に答える 1

2

非同期性を受け入れましょう!

public static native void u2FTest(com.google.gwt.core.client.Callback<String, Integer> callback) /*-{
  // …
  $wnd.u2f.register(regReqs, signReqs, $entry(function(response) {
    if (response.errorCode) {
      callback.@com.google.gwt.core.client.Callback::onFailure(*)(@java.lang.Integer::valueOf(I)(response.errorCode));
    } else {
      callback.@com.google.gwt.core.client.Callback::onSuccess(*)(JSON.stringify(response));
    }
  }));
}*-/;

$entry()(例外が にルーティングされるように、コールバックをラップすることを忘れないでくださいGWT.UnhandledExceptionHandler)

于 2015-03-27T16:24:38.920 に答える