2017-02-05 4 views
0

클래스를 설계했습니다. AsyncCalllback을 구현하는 AsyncClass라고 할 수 있습니다. 두 개의 전역 변수 boolean flagObject val이 있습니다. 그리고 생성자는 다음과 같다 :GWT Asyncus 콜백을 사용하여 동기/차단 호출 만들기

public void onSuccess(Object x){ 
     this.flag=true; 
     this.val=x; 
} 

이제 제가 원하는 것은이 여기에서 반환 값을 얻을 수 있습니다 :

AsyncClass() 
{ 
    this.flag=false; 
    this.val=null; 
} 

onSuccess() 기능은 다음과 같이 정의된다. 그래서 내가 전화하기 :

AsyncClass callback=new AsyncClass(); 
service.getResult(createRequestObject(),callback) 

을하고 난 플래그가 true 차례를 기다리고 계속 while 루프를 실행합니다.

while(!callback.flag); 

그러나 무한 루프에 걸릴 수 있습니다. 왜 이런 일이 발생합니까 ??

+0

AsyncCallback의 onFailure 및 onSuccess 메소드를 사용해야합니다.GWT는 이벤트 구동 방식이므로 호출이 성공하거나 실패하고 그 중 하나가 호출됩니다. 그것을 전화로 생각하고 잊어 버린 다음, 이벤트가 기다리던 지 또는 실패했는지를 기다리십시오. – WLGfx

+0

정확히 어떤 일을하고 계십니까? onSuccess 메서드는 플래그를 켜기로되어 있으므로 while 루프 조건이 false로 충족되어 종료됩니다. 그러나 while 루프는 영원히 계속됩니다. 콜백 객체가 현재 스레드에 의해 유지되고 릴리스 될 때까지 아무 일도 일어나지 않기 때문입니까? –

+1

맞음 - 단 하나의 스레드 만 있으므로 서버 호출을 시작한 코드가 브라우저로 제어를 반환 할 때까지 onSuccess를 실행하려고 시도 할 방법이 없습니다. –

답변

1

미리 정의 된 onSuccess 개의 메소드를 사용하여 Async 클래스를 미리 만들 필요는 없습니다. 그 위치에 정의 할 수 있습니다. 비동기 호출을 다음 호출이 성공하면 반환 값의 사용을 확인하려면
,이 시도 :

service.getResult(createRequestObject(), new AsyncCallback() { 
    public void onSuccess(final Object returnedValue) { 
     doSomethingWith(returnedValue); 
    } 
    public void onFailure(Throwable caught) { 
     // code for the call failing (alert, log...) 
    } 
}); 

을 더 나은 아직, 서비스가 String 같은 특정 유형을 반환하는 경우, 사용을 AsyncCallback의 일반 버전 대신 원시 하나 :

service.getResult(createRequestObject(), new AsyncCallback<String>() { 
    public void onSuccess(final String returnedValue) { 
     doSomethingWithString(returnedValue); 
    } 
    // onFail etc. 
}); 

통화가 이루어지면 그것이 성공하면, 당신의 doSomethingWith 메소드가 호출되고 실행이 거기에서 계속됩니다.


편집 : 그들은 (이하 "비동기"이름에도 불구하고) 클라이언트 코드가 아닌 비동기 하나에서 동기 호출을 구현하기 위해 노력하고 같은 영업 이익의 의견에 따라, 그것은 보인다. GWT의 RPC 라이브러리를 사용하는 것이 가능하지는 않습니다. this, thisthis에 따르면 JSNI 메소드를 통해 순수 자바 스크립트로 호출을 구현해야합니다. 그러나 이러한 질문에 대한 모든 대답은 동기식 호출을 피하고 대신 비동기식으로 수행하는 것이 좋습니다.

+0

당신은 요점을 놓치고 있습니다. 나는 반환 가치를 얻을 때까지 차단하고 싶다. 문제는 단일 스레드 시스템이므로 차단 메커니즘이 onSucess()를 실행하지 못하게합니다. –

+1

** 비동기 ** 콜백 메커니즘을 사용하여 ** 동기 ** 호출을 구현하는 경우 _you_가 포인트를 놓치고 있다고 말할 수 있습니다. 어쨌든 내 대답을 편집 할게. – walen

0

통화가 비동기이며 동기화 상태로 작동하게하려는 경우. 내 경험에 이 매우 실용적되지 않습니다, 당신은 다음과 같이 조금 리팩토링 할 수 있습니다 : 당신이 정말로해야하는 이유 고체 이유가있는 경우

some_code; 
make_sync_call(new Receiver() { 
    void onSuccess() { 
     some_other_code; 
    } 
} 

some_code; 
make_sync_call; 
some_other_code; 

"자바 스크립트 바쁜 대기"는 아마 당신이 찾고있는 키워드 일 것입니다 (예 : 여기 What is the JavaScript version of sleep()?)

그러나 나는 콜백 기반의 방법.