2016-11-07 9 views
-1

私はGWTを使用しています。Javaクラスから呼び出されるネイティブ関数をいくつか持っています。コードにはいくつかのコードがあり、結果を生成してJavaコードに戻します。しかし残念なことに、内部サービス応答が返される前に、ネイティブ関数の戻り値が返されるため、空白に戻ります。JSNIがタイムアウト後に復帰する

ここにコードがあります

この関数はJavaクラスから呼び出されます。

public static native String getChartPng(int indexing)/*-{ 
     var result; 
     //getPngBase64String(onSuccess, onError, width, height, img quality) 
     if($wnd.chartings[indexing]){ 
      $wnd.chartings[indexing].getPngBase64String(function(response){ 
       //it takes couple of seconds 
       result = response; 

      },null,450,600,1); 
     } 
     return result 
    }-*/; 

この関数を呼び出すと、空の文字列が取得されます。どのように私はこのコードを使用して結果を戻しましたか?

答えて

1

AnyChartを使用していると思います。ここにはgetPngBase64String referenceがあります。

このメソッドは非同期です。つまり、メソッドの完了を待つことなくコードの実行が継続されます。そのため、次の文:return resultがすぐに呼び出され、未割り当てのresultが呼び出されます。

最初の2つのパラメータのgetPngBase64Stringメソッドは、メソッドの実行が成功(最初のコールバック)または失敗(2番目のコールバック)で終了するときに呼び出されるコールバック関数を使用します。結果はonSuccessコールバックでのみ使用できます。

だから、このような非同期メソッドについて考える必要があります:私のために何かを行い、完了したら教えてください。このメソッドは、成功(または失敗)時にコールバック関数を呼び出すことによって知らせます。

これで結果を返すことはできません。代わりに、結果をコールバック関数で処理する必要があります。

+0

はい、私はanychartを使用しています。私はこの解決策を知っていますが、成功コールバック関数の中には何でもしますが、その値を返したいと思います... –

0

本当に結果を返す場合は、ちょっと騙す必要があります。しかし、まず、これはの間違った方法であると言う必要があります。あなたはあなたのアプローチを改訂することについて本当に考えるべきです。

いくつかのフラグを使用して結果を待つことができます。このように:

public static native String getChartPng(int indexing) /*-{ 
    var result_ready = false; 
    var result; 
    //getPngBase64String(onSuccess, onError, width, height, img quality) 
    if($wnd.chartings[indexing]){ 
     $wnd.chartings[indexing].getPngBase64String(function(response){ 
      //it takes couple of seconds 
      result = response; 
      result_ready = true; 
     }, null, 450, 600, 1); 
    } 

    while(!result_ready); // do nothing, wait for the result - notice the `;` 

    return result 
}-*/; 

これは、busy waitingと呼ばれています。

関連する問題