2012-01-04 19 views
5

Birincisi, bir senkron çağrı yapıyor "yanlış" olduğunu biliyoruz ve "mümkün değil" biliyoruz.Sahte bir GWT Senkron RPC çağrısı Her

Ancak, bir durumda çok karmaşık (nasıl açıklayacağımı bilmiyorum), sunucudan yanıt beklemem gerekiyor, GWT RPC çağrıları için GWT-Platform komut uygulamasını kullanıyorum.

Bunu yaptığın için "kesmek" bir tür arıyordu.

Şimdiden teşekkürler.

+3

Yapmayın. Probleminiz için asenkron bir çözüm bulun. –

+3

"Her şeyden önce, eşzamanlı bir çağrı yapmanın" yanlış "olduğunu ve" mümkün olmadığını "biliyorum." – caarlos0

+0

Bu mümkündür, ancak bu kolay değildir, gerçekten yapmak ister misiniz? – jusio

cevap

5

bir çözüm vardır ama (örn o iş yapmak için tek bir parametre çevirmek olamaz) kolay değildir. GWT, başlık altında normal JS XMLHttpRequest kullanıyor. GWT'de, com.google.gwt.xhr.client.XMLHttpRequest adlı bir yer paylaşımlı türü vardır. Bu sınıf, sunucuya HTTP üzerinden istek göndermek için kullanılır. Her bir JS XMLHttpRequest ilk önce çağrı yöntemiyle başlatılır. Bu yöntemin birkaç parametresi vardır, ancak üçüncü parametre, isteğin eşzamansız olması gerekip gerekmediğini belirtir. Yanlış olarak değiştirirseniz, istek senkronize olur.

Ancak GWT-RPC, bu sınıfı doğrudan kullanmıyor, RpcRequestBuilder aracılığıyla kullanıyor ve bu sınıf XMLHttpRequest'i doğrudan kullanmıyor, RequestBuilder kullanıyor.

Yapmanız gereken şey, RpcRequestBuilder ve RequestBuilder'ın özelleştirilmiş sürümünü oluşturmaktır (bu, XMLHttpRequest'in senkronize olacak şekilde başlatılmış olanını kullanacaktır).

sen ServiceDefTarget bunu döküm ederek, GWT-RPC hizmeti örneğine RPCRequest oluşturucu ayarlayabilirsiniz.

hala senkron GWT-RPC istekleri istiyor musunuz?

+0

Tanrı'nın annesi, sıkı çalışma. Bunu yapmaya çalışıyorum pes ediyorum. Cevabını şimdilik doğruya koyacağım. Yine de teşekkürler. – caarlos0

8

Genellikle, RPC isteğinin onSuccess() işlevinde şeyler ele alarak, otomatik olarak "sunucudan yanıtını bekleyin" olacak. Yani şu anda çalışan tüm kodları engellemek istediğinizi farz ediyorum? JavaScript'in tek iş parçacıklı olması kolay olmayacağından, programı durduran bir uyku fonksiyonu yoktur.

Ama bir zamanlayıcı kullanarak bir kesmek istediğini yapar olabilir: Yukarıdaki örnekte this.schedule(100) eser olmadığını denemedim

Timer checkRPCResponse = new Timer() { 
     @Override 
     public void run() { 
      if (!serverResponseReceived) { 
       this.schedule(100); 
      } else { 
       proceedWithProgram(); 
      } 
     } 
    }; 
    checkRPCResponse.schedule(100); 

, ancak bir olan fikir edinmek sunucunun her 100 ms'de yanıt verdiğini kontrol edin. Tabii ki onSuccess() işlevinde serverResponseReceived = true'u kendiniz ayarlamanız gerekir. RPC'den hemen sonra zamanlayıcıyı çağırın.

+0

Zaten böyle bir şey yapmayı denedim, ama işe yaramıyor çünkü bunu bir alıcıya ihtiyacım var. Her neyse, yanıt sunucudan gelmeden önce bir olayı çağıran küçük bir çözüm yaptım ve sunucuda bilgi ihtiyacım vardı, tüm widget'ları tekrar güncelledim. Bu benim sorunum için en iyi çözüm değil, ama, benim bulduğum tek yol ... – caarlos0

0

GWT XMLHttpRequest.open() numaralı çağrıları, üçüncü parametresi olarak doğru olarak çağırır; bu, çağrının eşzamansız olacağı anlamına gelir. Hep yanlış olduğu bu üçüncü parametreyi zorlayarak test amaçlı benzer bir ihtiyacı çözüldü: fakeXMLHttpRequestOpen() yürütmesini sonra

private static native void fakeXMLHttpRequestOpen() /*-{ 
    var proxied = $wnd.XMLHttpRequest.prototype.open; 

    (function() { 
     $wnd.XMLHttpRequest.prototype.open = 
      function() { 
       arguments[2] = false; 
       return proxied.apply(this, [].slice.call(arguments)); 
      }; 
     })(); 
}-*/; 

, XMLHttpRequest daha fazla yararı eşzamanlı hareket edecektir. Örneğin:

remoteSvc.getResult(new AsyncCallback<String>() { 
    @Override 
    public void onSuccess(String result) { 
     GWT.log("Service called!"); 
    } 

    @Override 
    public void onFailure(Throwable caught) { 
     GWT.log("Service failed..."); 
    } 
} 

GWT.log("Last message"); 

daima verecek:

Service called! 
Last message 

XMLHttpRequest.open() spesifikasyonu için https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open bakınız.