2012-01-04 51 views
5

Trước hết, tôi biết rằng thực hiện cuộc gọi đồng bộ là "sai" và biết rằng "không thể thực hiện được".Giả mạo cuộc gọi RPC Đồng bộ GWT

Nhưng, trong một tình huống phức tạp rất nhiều (tôi không biết cách giải thích), tôi cần phải chờ phản hồi từ máy chủ, tôi đang sử dụng triển khai lệnh GWT-Platform cho các cuộc gọi GWT RPC.

Tôi đang tìm một số loại "hack" để thực hiện việc này.

Xin cảm ơn trước.

+3

Không làm điều đó. Tìm một giải pháp không đồng bộ cho vấn đề của bạn là tốt hơn. –

+3

"Trước hết, tôi biết rằng thực hiện một cuộc gọi đồng bộ là" sai ", và biết rằng" là không thể "." – caarlos0

+0

Có thể, nhưng nó không phải là dễ dàng, bạn có thực sự muốn làm điều đó? – jusio

Trả lời

5

Có một giải pháp nhưng không dễ dàng (ví dụ: bạn không thể lật một thông số duy nhất để làm cho nó hoạt động). GWT đang sử dụng JS XMLHttpRequest bình thường dưới mui xe. Trong GWT, có một loại lớp phủ cho nó được gọi là com.google.gwt.xhr.client.XMLHttpRequest. Lớp này được sử dụng để gửi yêu cầu đến máy chủ qua HTTP. Mỗi JS XMLHttpRequest được khởi tạo đầu tiên bằng cách gọi phương thức mở. Phương thức này có vài tham số, nhưng tham số thứ ba chỉ định nếu yêu cầu không đồng bộ. Nếu bạn thay đổi thành false, yêu cầu sẽ được đồng bộ.

Nhưng GWT-RPC không trực tiếp sử dụng lớp này, nó sử dụng nó thông qua RpcRequestBuilder và lớp này cũng không sử dụng trực tiếp XMLHttpRequest, nó đang sử dụng RequestBuilder.

Vì vậy, những gì bạn cần làm là tạo phiên bản tùy chỉnh RpcRequestBuilder và RequestBuilder (sẽ sử dụng XMLHttpRequest được khởi tạo để đồng bộ).

Bạn có thể đặt trình tạo RPCRequest thành cá thể dịch vụ GWT-RPC của bạn bằng cách truyền nó tới ServiceDefTarget.

Bạn vẫn muốn có yêu cầu GWT-RPC đồng bộ không?

+0

Mẹ của Đức Chúa Trời, làm việc chăm chỉ. Tôi từ bỏ cố gắng để làm điều này. Tôi sẽ đặt câu trả lời của bạn ngay bây giờ. Dù sao cũng cảm ơn bạn. – caarlos0

8

Thông thường, bằng cách xử lý các công cụ trong hàm onSuccess() của yêu cầu RPC, bạn sẽ tự động "chờ phản hồi từ máy chủ". Vì vậy, tôi giả sử bạn muốn chặn tất cả các mã hiện đang chạy? Vì JavaScript là một luồng không dễ dàng, nên không có chức năng ngủ chỉ dừng chương trình.

Nhưng nó có thể là một hack sử dụng một bộ đếm thời gian làm những gì bạn muốn:

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

tôi đã không cố gắng hiểu xem this.schedule(100) công trình trong ví dụ trên, nhưng bạn sẽ có được ý tưởng, mà là một kiểm tra xem máy chủ có phản hồi 100 ms một lần hay không. Tất nhiên bạn phải tự mình đặt serverResponseReceived = true trong hàm onSuccess(). Gọi bộ hẹn giờ ngay sau RPC.

+0

Tôi đã thử làm một cái gì đó như thế này, nhưng nó không hoạt động, bởi vì tôi cần điều này trong một getter. Dù sao, tôi đã thực hiện một workaround ít, gọi một sự kiện trước khi phản ứng đến từ máy chủ, và, trong presenter tôi đã cần các thông tin, tôi cập nhật một lần nữa tất cả các vật dụng. Đó không phải là giải pháp tốt nhất cho vấn đề của tôi, nhưng, là cách duy nhất tôi tìm thấy ... – caarlos0

0

Gọi GWT XMLHttpRequest.open() đúng với tham số thứ ba có nghĩa là cuộc gọi sẽ không đồng bộ. Tôi giải quyết một nhu cầu tương tự cho mục đích thử nghiệm chỉ buộc tham số thứ ba này là luôn luôn sai:

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)); 
      }; 
     })(); 
}-*/; 

Sau khi gọi fakeXMLHttpRequestOpen(), bất cứ tiếp tục sử dụng XMLHttpRequest sẽ hành động đồng bộ. Ví dụ:

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"); 

sẽ allways render:

Service called! 
Last message 

Xem https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open cho XMLHttpRequest.open() đặc điểm kỹ thuật.

Các vấn đề liên quan