GWT Однопоточные асинхронные обратные вызовы

rpc.call(mycallback);

{
//subsequent code block

}
  1. Как работает однопоточный асинхронный обратный вызов?
  2. Когда будет вызван обратный вызов?
  3. Будет ли последующий блок кода всегда завершаться до того, как будет разрешен обратный вызов (т. Е. Будет ли обратный вызов выполняться только после завершения всего кода?)?

4 ответа

Решение

#1 javascript является однопоточным, а браузер - нет, поэтому js-thread отправляет браузеру вызов xhr для его разрешения, и браузер немедленно возвращает ему элемент управления.

# 2, когда браузер получает ответ от сервера, он помещает обратный вызов в поток js, поэтому он будет выполнен, когда js завершит то, что он может выполнять сейчас (в вашем случае последующий блок кода)

# 3 да, так и будет, потому что однопоточное выполнение этого блока предотвращает выполнение любого другого отложенного кода (тайм-ауты, обратные вызовы) до его завершения.

С GWT-RPC асинхронный обратный вызов выглядит следующим образом:

AsyncCallback<ResultBean> callback = new AsyncCallback<ResultBean>() {
    public void onSuccess(ResultBean result) {
        // Code to run once callback completes
    }

    public void onFailure(Throwable caught) {
        // Error handling code
    }
};

asyncService.call(callback);

// Subsequent code block

onSuccess() метод будет вызван после получения результатов от сервера. Последующий блок кода будет выполнен до завершения обратного вызова, потому что один поток должен завершить выполнение текущего события, прежде чем он сможет обработать следующее в очереди. Чтобы убедиться, что некоторый код выполняется после завершения обратного вызова, он должен вызываться из onSuccess() метод.

Вот техническое объяснение того, как это работает в однопоточной среде (можно найти здесь у Томаса Бройера):

GWT-RPC использует RequestBuilder, который основан на XMLHttpRequest. XMLHttpRequest (XHR) использует события для обратной связи с кодом, поэтому все, что происходит в XHR, приводит к тому, что событие помещается в очередь событий и удаляется из цикла обработки событий.

Смотрите также документацию GWT.

На данный момент нет разницы между

rpc.call(mycallback);
{
   //subsequent code block
}

или же

{
   // code block before
}
rpc.call(mycallback);

Однако я не вижу оснований полагаться на такое поведение. Если вы хотите быть уверены, что блок кода был выполнен, используйте вторую версию

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

Так,

когда вызов сервера кода запускает //subsequent code block начинает выполнение, а когда вызов заканчивается, код в onSuccess блоки кода начинают выполняться.

Если блок кода onSuccess и последующий блок кода независимы, то нет никакой разницы, будет ли звонить сервер или после него.

если оба зависят

rpc.call(new AsynchCallback { 
        onSucees(){
                   //subsequent code block
                  }
   });
Другие вопросы по тегам