2017-02-08 8 views
0

私は要求から応答変数を保存する必要は、areaRequestはこの作品RequestContextのですが、私はそれを保存し、保存応答変数 - GWT

Long temp; 
    areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() { 
     @Override 
     public void onSuccess(Long response) { 
      temp = response; 

     }   
    }); 

答えて

-1

まあ、GWTと多くの時間は、私がこれまで見つかったソリューションは、ネストされた非同期呼び出しを作成した仕事の後。

areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() { 
@Override 
public void onSuccess(Long response) { 
// Here I pass the value from the first request 
    anotherRequest.anotherFunction(response).fire(new Receiver<Long>(){ 
     @Override 
     public void onSuccess(Long new_response){ // Long again it could be anything it depends of your function 
      doWhateverYouWant(new_response) 
     } 
    }); 
}   

});

+0

私はあなたが必要以上に難しいと思っています。 Walenが最後にした答えを見てください。 – Knarf

+0

その答えは機能しません。非同期応答から変数を保存することはできません。だから、これを行う方法は、最初に2番目の呼び出しに必要な変数を返す関数を呼び出すことです。私はもっ​​と難しくはない、私の目の前では、これは最も単純な解決策だ –

1

することができますスコープの外にそれを使用することはできませんレシーバー内の最終的でない変数の外側で使用しないでください。単にスコープの問題を回避するために

迅速かつ汚いの変化は次のようになります。

final Long[] temp = {-1}; 
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() { 
    @Override 
    public void onSuccess(Long response) { 
     temp[0] = response; 
    }   
}); 
doSomethingWith(temp[0]); 

しかし、それはあなたが何をしたいのか、通常ではありません。 countByCurrentInstitution()が非同期呼び出しであるため、doSomethingWith()を呼び出した時点でtemp[0]がまだ-1になるため、asyncメソッドが別のスレッドで実行されているためです。
メインスレッドは単純なThread.sleep()または(yikes!)非常に長いループを使用して少し待つことができますが、やはり速いハックとエラー(その呼び出しにそれより時間がかかりますか?

最良のオプションはLong tempを捨て、ちょうどonSuccess()メソッド内にコードを移動することです:

areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() { 
    @Override 
    public void onSuccess(Long response) { 
     doSomethingWith(response); 
    }   
}); 
+0

これは機能しません。要求スコープの後の一時変数は常に-1です。サーバーから値を取得する別の方法はありますか? –

+0

私はすでにそれについて警告しました。最初の例は、範囲の問題を避けるためのちょっとした方法です。実際に値を使用するには、2番目の例のようにonSuccess()メソッド内でロジックを移動する必要があります。 – walen

+0

私はこれを行う必要がある理由は、その関数が変更された値を返すが、あなたはonSuccess()の中でreturnを使うことができないからです。 –

関連する問題