Вопрос был:
Как вернуть ответ от асинхронного вызова?
, который может быть интерпретирован как:
Как сделать синхронный асинхронный код синхронным?
Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.
Я хотел бы привести пример для запроса Ajax.
(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)
Позволяет сначала включить использование JQuery, чтобы
$
был доступен какS
:__pragma__ ('alias', 'S', '$')
Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:
def read(url: str): deferred = S.Deferred() S.ajax({'type': "POST", 'url': url, 'data': { }, 'success': lambda d: deferred.resolve(d), 'error': lambda e: deferred.reject(e) }) return deferred.promise()
Использовать асинхронный код, как если бы он был синхронным:
async def readALot(): try: result1 = await read("url_1") result2 = await read("url_2") except Exception: console.warn("Reading a lot failed")
Сначала вы должны использовать в web.xml
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
, поскольку org.apache.struts2.dispatcher.FilterDispatcher
устарел.
Вы можете увидеть страницу индекса, потому что она показана веб-контейнером Tomcat, и у нее нет тегов Struts (например, любой другой веб-проект без рамки Struts).
URL-адрес браузера показывает /test1/
. Затем вы делаете запрос /test1/abc
, нажимая кнопку отправки, и он был отфильтрован struts2, но он не смог найти действие с именем abc
ни в пространстве имен /
, ни в пространстве имен по умолчанию, и у вас нет любой ресурс с этим путем, поэтому вы получили ошибку 404.
Вы могли бы сказать, что настроили действие с именем abc
в пространстве имен по умолчанию. Но эта конфигурация недоступна во время выполнения, также имя пакета должно быть struts-default
, которое распространяется на ваш пакет.
Файл struts.xml
должен находиться в пути к классам, это означает, что в папке src
или resources
. При компиляции он копируется в папку вывода компилятора. После сборки он будет скопирован в WEB-INF/classes
из выходной папки компилятора. Эти две папки временно созданы и могут быть удалены перед процессом, поэтому, если у вас нет struts.xml
в исходной папке, вам не хватает этого файла при запуске приложения.
Также обратите внимание, что у вас нет страниц JSP в папке webcontent, которые вы использовали в результатах.