2017-07-27 8 views
1

Je n'arrive pas à comprendre comment renvoyer une valeur String à partir de la méthode sendRequest() de RequestBuilder après avoir reçu une réponse. Je me suis référé à un similar question où la suggestion était d'utiliser Callback<String, String> callback mais je ne peux pas comprendre comment implémenter ceci. Le GWT documentation pour Callback n'a aucun exemple.GWT - Comment renvoyer une valeur String de RequestBuilder après avoir reçu une réponse?

Ce que j'ai est une classe Requester avec la méthode generateRequest() qui devrait faire une demande avec RequestBuilder et retourner une chaîne quand elle est appelée. La méthode processResponse() prend la réponse, l'analyse et renvoie une chaîne que je stocke dans output. Comment puis-je retourner cette chaîne output lorsque generateRequest() est appelée d'une autre classe?

public String generateRequest() { 
     RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url.getUrl())); 
     builder.setHeader("Authorization", authHeader); 
     String title = null; 

     try { 
      builder.sendRequest(null, new RequestCallback() { 

       public void onError(Request request, Throwable exception) { 
        GWT.log(exception.getMessage()); 
       } 

       public void onResponseReceived(Request request, Response response) { 
        String output = processResponse(response); 
       } 
      }); 
     } catch (RequestException e) { 
      GWT.log(e.getMessage()); 
     } 

    return title; 
} 

Répondre

1

Figurez-vous, c'est le code:

statement01; 
statement02; 
String result = generateRequest(...); 
statement04UsingResult; 
statement05; 

alors cela ne fonctionnera pas, car résultat ne sera pas disponible avant statement04UsingResult est exécutée. La demande n'est pas encore terminée. (Comme Andrej déjà mentionné)

Pour résoudre ce problème, diviser votre code:

statement01; 
statement02; 
generateRequest(...); 

créer une nouvelle méthode vide, Wich accepte le résultat en tant que paramètre:

public void newMethod(String result) { 
    statement04UsingResult; 
    statement05; 
} 

et appeler à l'intérieur du onResponseRevieve -méthode:

  builder.sendRequest(null, new RequestCallback() { 

      public void onError(Request request, Throwable exception) { 
       GWT.log(exception.getMessage()); 
      } 

      public void onResponseReceived(Request request, Response response) { 
       newMethod(processResponse(response)); 
      } 
     }); 

Espérons que cela aide.

2

Je pense que vous pourriez malentendre quelque chose.

Vous ne pouvez pas simplement renvoyer une chaîne car l'appel est asynchrone (c'est-à-dire que vous ne pouvez pas renvoyer la chaîne car la chaîne n'est pas encore disponible, au moment où vous souhaitez la renvoyer). Vous pouvez simplement attendre jusqu'à ce que le résultat de l'appel soit prêt, mais c'est une pratique vraiment terrible; C'est pourquoi vous voyez des gens suggérant des rappels.