9

(そのタイトルだけで、人々は木工品から出てきて、クラブで私を打ちのめすはずですが、私を聞いてください)。

非同期呼び出しから値を返す必要があるユースケースがあります。(私はGWT-Platformを使用していますが、概念は同じです。)最後のJavaScriptObject配列を宣言し、AsyncCallback内で値を割り当てました。ただし、値を返す必要があり、AsyncCallbackが完了する前にメソッドが戻ります。したがって、AsyncCallbackが完了するまで何らかの方法でブロックする必要があります。別のメソッドで戻り値が必要です。または、onSuccess()で必要なことを実行します。

ループ、タイマー、その他いくつかの方法を試しましたが、うまくいきませんでした。誰か助けてもらえますか?

@Override
public JavaScriptObject doGetWhereAmIMarker(final double lng, final double lat) {

    final JavaScriptObject[] markerArray = new JavaScriptObject[1];  // ugly hack, I know
    dispatch.execute(new GetLocationDescriptionsAction(lng, lat), new AsyncCallback<GetLocationDescriptionsResult>() {
        @Override
        public void onFailure(Throwable caught) {
            caught.printStackTrace();
        }

        @Override
        public void onSuccess(GetLocationDescriptionsResult result) {
            Map<String, Location> resultMap = result.getResult();
            StringBuffer message = new StringBuffer();
            for (String key : resultMap.keySet()) {
                message.append(key).append(": ").append(resultMap.get(key)).append("\n");
            }

            Map tempMap = new HashMap();
            tempMap.put("TITLE","Location Information");
            tempMap.put("LAT", lat);
            tempMap.put("LNG", lng);
            tempMap.put("CONTENTS", message.toString());

            JavaScriptObject marker = GoogleMapUtil.createMarker(tempMap);
            markerArray[0] = marker;
            if (markerArray[0] != null) {
                GWT.log("Marker Array Updated");
            }

        }
    });

    return markerArray[0];
}

更新:要求に応じて、doGetWhereIAmMarker()を呼び出すコードを次に示します。Google Mapオブジェクト(JavaScriptObjectとして)をパラメーターとして使用して別のネイティブメソッドを使用しようとしましたが、ネイティブメソッド間でそのオブジェクトを渡すと、そのオブジェクトを更新する機能が失われるようです。

public native void initMap(JavaScriptObject mapOptions, JavaScriptObject bounds, JavaScriptObject border, JsArray markerArray, Element e) /*-{

    // create the map and fit it within the given bounds
    map = new $wnd.google.maps.Map(e, mapOptions);
    if (bounds != null) {
        map.fitBounds(bounds);
    }

    // set the polygon for the borders
    if (border != null) {
        border.setMap(map);
    }

    // set up the info windows
    if (markerArray != null && markerArray.length > 0) {
        var infoWindow = new $wnd.google.maps.InfoWindow({
            content:"InfoWindow Content Goes Here"
        });

        for (var i = 0; i < markerArray.length; i++) {
            var marker = markerArray[i];
            marker.setMap(map);
            $wnd.google.maps.event.addListener(marker, 'click', function() {
                infoWindow.setContent(marker.content);
                infoWindow.open(map, this);
            });
        }
    }

    // need to reference the calling class inside the function(), so set a reference to "this"
    var that = this;

   $wnd.whereAmI=function(lng, lat) {
        that.@org.jason.mapmaker.client.view.MapmakerMapViewImpl::whereAmI(DD)(lng,lat);
   }

    $wnd.google.maps.event.addListener(map, 'click', function(event) {
        var lat = event.latLng.lat();
        var lng = event.latLng.lng();
        $wnd.whereAmI(lng, lat);
    });

}-*/;
4

2 に答える 2

3

ある時点で私は似たようなことをしなければなりませんでしたが、最終的には非同期のものを優先してそのコードを削除しました。したがって、私はあなたが使用する必要のある正確なコードを与えることはできませんが、それにアプローチする方法についてのいくつかの指針しか与えません。

  • まず、このブログでは、 JavaScriptを使用して同期AJAXを実行する方法について説明します。
  • 次に、同期呼び出しのサポートを提供する必要があります。問題は、GWTが同期AJAX呼び出しを提供するパラメーターをサポートしていないことです。ほとんどの場合、彼らはその使用を奨励したくないということです。したがって、JSNIを使用して、適切なメソッドをXMLHttpRequest(おそらく拡張する)に追加してから(拡張する必要があります)に追加する必要がありますRequestBuilder
  • 最後に、extendedを使用してサービスを修正しますRequestBuilder。何かのようなもの

((ServiceDefTarget)service).setRpcRequestBuilder(requestBuilder);

そして結論として-同じブログ投稿から(少し文脈から外れています):

リクエストが失われてブラウザがハングする危険性があるため、(onbefore)unloadイベントハンドラの外部では同期JavaScriptは推奨されません。

于 2011-09-08T20:02:17.910 に答える
0

私はそれがすべて運命だと思います....
Gwtで応答をキャッチして送信することはできません。要求が送信された直後に次のメソッドが実行を開始し、応答を気にしないためです。私が思うこと...

 Timer t = new Timer() {
      @Override
      public void run() {
        Window.alert("Nifty, eh?");
      }
    };
    t.schedule(5000);
于 2013-09-27T10:52:27.900 に答える