Как далеко GWT AsyncCallback выполнит в ожидании ответа? - PullRequest
5 голосов
/ 17 февраля 2011

Если бы я вызывал функцию (все написано на Java):

public int hello() {
int a = 1;
executeCallback();
// C: Question lies in this range
return a;
}

public void executeCallback() {
// A: random code to execute before asynccallback
   randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
      onSuccess();
      onFailure();
   });
// B: random code to execute after asynccallback
}

Я понимаю, что материал в комментарии A будет выполняться, и одновременно будет выполняться несинхронный randomMethod, и будет выполняться комментарий в B.

Мне было интересно, хотя, в то время как randomMethod выполняется (если это занимает достаточно много времени), вернется ли функция к своему вызывающему (в данном случае метод 'hello') и начнет выполнять код в комментарии C? Или выполнит CallCall для ожидания завершения randomMethod, прежде чем он вернется?

И если это первое, предположим, что мне нужна информация, к которой прикасается randomMethod, прежде чем я смогу продолжить комментировать C, как я могу заставить его «ждать», чтобы убедиться, что это будет так?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Когда вызывается асинхронный метод, программа не ожидает этот метод, поэтому они называются асинхронными. Невозможно, чтобы методы randomMethod AsyncCallback onSuccess или OnFailure выполнялись до кода, представленного как B .. Поскольку браузер выполняет код javascript в одном потоке, методы onSuccess или OnFailure выполняются после завершения вызова метода executeCallBack.

Если вы хотите, чтобы код B и код C выполнялись после randomMethod, вы должны поместить их в методSuccess, например;

randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() {
      onSuccess() {
         // B: random code to execute after asynccallback
        // C: Question lies in this range
        }
      }
      onFailure()
   });
2 голосов
/ 17 февраля 2011

Позвольте мне немного объяснить модель выполнения, поскольку иногда проще, если вы знаете, что происходит "за кадром".

Все выполнение кода инициируется браузером.Это происходит при определенных событиях, например, когда страница загружается, когда пользователь что-то щелкает или когда приходит ответ AJAX.

Итак, что вы делаете, когда пишете приложение GWT (или другое JavaScript), вызарегистрировать обработчики, например, используя onModuleLoad(), или зарегистрировав ClickHandler для кнопки, или AsyncCallback для вызова GWT-RPC.

Интересная (и, возможно, нелогичная?) вещь заключается в том, что когдабраузер вызывает такой обработчик, он выполняется , пока не завершится (или пока не произойдет ошибка).Только после этого будут выполняться другие обработчики. Кстати, это также означает, что если код для одного обработчика содержит бесконечный цикл, другие обратные вызовы никогда не будут выполнены - вся вкладка браузера будет блокироваться.

Так что, когда ваш hello() метод выполняется, это делается как часть некоторого обработчика (например, onModuleLoad или ClickHandler).

  • устанавливает a = 1,
  • , затем отправляет запрос AJAX (randomClass.randomMethod),
  • регистрирует другой обработчик AsyncCallback (помните, это просторегистрация. Браузер сначала завершит текущий обработчик, прежде чем он сможет фактически выполнить этот обработчик AsyncCallback.
  • выполняет B
  • выполняет A
  • продолжает выполнение доиерархия вызовов, пока не закончится обработчик.
1 голос
/ 17 февраля 2011

1] Асинхронное общение может занять немного времени, чтобы привыкнуть. Необходимо помнить, что клиент продолжает следующий оператор сразу после вызова удаленной процедуры, независимо от того, сколько времени занимает выполнение процедуры на сервере и передача данных с сервера на клиент.

2] Вы можете выполнить // C: вопрос лежит в этом диапазоне в методе onSuccess

...