2012-06-18 5 views
3

В моем приложении GWT-Platform я реализовал метод, в котором один шаг - выборка данных с сервера, и следующий шаг зависит от него. Я хочу, чтобы мой метод для дальнейшего выполнения кода до тех пор, пока вызов Async не завершится.Запретить вызов метода до тех пор, пока не завершится вызов Async GTA-Platform

Должно быть что-то простое, но я не нахожу пути.

ответ

5

Я думаю, что вам не хватает точки, когда сеть является асинхронной.

Это не считается хорошей практикой (это скорее анти-шаблон), чтобы блокировать выполнение кода вашей клиентской стороны до завершения асинхронного вызова.

Так вместо того, чтобы блокировать выполнение, пока коды асинхронных не будет закончены сделать следующее:

  1. Создать событие, которое запускаемое на мировом Eventbus, когда ваш код асинхронного закончен
  2. Приложить Обработчик для этого события в одном из своих докладчиков
  3. Начала асинхронной код
  4. Покажите указатель нагрузки
  5. Когда вызов асинхронного закончен скрыть индикатор загрузки и огнь события на т he Eventbus
  6. Обращайтесь к следующему шагу в обработчике, который вы создали ранее.
2

Я не гутер GWT, но я знаю, как это делается простым способом. Буду очень признателен, если кто-то расскажет, как это сделать правильно, потому что меня это тоже интересовало. Вы можете просто сделать метод, который будет содержать необходимый код и вызывает его OnSuccess или сделать что-то вроде этого:

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.Timer; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.RootPanel; 

public class Aaa implements EntryPoint { 

    private final MyServiceAsync service = GWT 
      .create(MyService.class); 
    private Timer t; 

    public void onModuleLoad() { 
     t = new Timer() { 
      @Override 
      public void run() { 
       // Make something or call function 
       Window.alert("Next Step"); 
      } 
     }; 
     final Button sendButton = new Button("Send"); 
     sendButton.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       service.sendInfo("Send First Step Info", 
         new AsyncCallback<String>() { 
          @Override 
          public void onSuccess(String result) { 
           Window.alert("Success Call"); 
           // Call Next step code or function 
           t.schedule(1); 

          } 

          @Override 
          public void onFailure(Throwable caught) { 
           Window.alert("Failure Call"); 
          } 
         }); 
      } 
     }); 
     RootPanel.get().add(sendButton); 
    } 
} 
+0

Hi Тарасом, Любезно рассмотреть follwing код snipet и дайте мне знать, как он будет работать, как вы предлагаете, общественного недействительными SomeMethod() { \t шаг1; \t \t стадия2; // Здесь идет асинхронный вызов \t \t step3; // Я хочу выполнить этот шаг только после завершения шага 2. Что я должен сказать GWT, чтобы дождаться завершения асинхронного вызова? } Я знаю, что мы идем против асинхронного поведения, но для меня это необходимо. – Bhavesh

1

Почему с помощью Timer?

final Button sendButton = new Button("Send"); 
sendButton.addClickHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 
     service.sendInfo("Send First Step Info", 
       new AsyncCallback<String>() { 
        @Override 
        public void onSuccess(String result) { 
         Window.alert("Success Call"); 
          nextStep(result); 
        } 

        @Override 
        public void onFailure(Throwable caught) { 
         Window.alert("Failure Call"); 
        } 
       }); 
    } 
}); 

private void nextStep(String data) { 
} 
0

Мне пришлось изменить исходный поток, в основном переместить его и направить на вызов Async onSuccess().

Первоначально поток

  1. пользователь нажимает кнопку диалогового poopup нормально
  2. Validate (Everthing является передней проверкой конца), если по ошибке проверки, за исключение броска и показать ошибки. diaglog не закрыт.
  3. При успешной проверке выполните обработку данных и закройте диалог.

В настоящее время в новом сценарии проверка # 2 изменена, чтобы потребовать переадресацию вызова на задний план. Поэтому # 3 нужно переместить в цепочку для обратного вызова метода проверки.' Фрагменты кода ниже

public void onValidationDataReady(List<Long> existingTests) throws ValidationException { 

    if (!existingTests.isEmpty()) { 
     throw new ValidationException("The entered name has already been used."); 
    } 

    //only after the validation do we proceed with the original OK click 
    proceedOkClick(testNameField.getValue()); 
} 

public void proceedOkClick(String data) { 
    // proceed only after the async call 

    if (callback != null) { 
     callback.onDialogResult(true, data); 
    } 

    clearDialog(); 
} 


public boolean validateInputs() throws ValidationException { 
    //async call to get data from back end. 
      //pass in a Callback 
    testNameValidator.validate(testNameField.getValue(), new DataReadyCallback<List<Long>>() { 
     @Override 
     public void onDataReady(List<Long> existingTests) { 
      onValidationDataReady(existingTests); 
     } 
    }); 
    return true; 
} 

//The call back interface. 
public interface DataReadyCallback<T> { 
void onDataReady(T data); 
} 
Смежные вопросы