Я разрабатываю приложение в aureliajs. Процесс разработки запущен уже много месяцев, и теперь бэкенд-разработчики хотят сделать свои сервисы версионными. Итак, у меня есть веб-служба, которую нужно вызвать, чтобы получить версию каждого приложения на стороне сервера (веб-API), а затем, для дальнейших запросов, вызвать правильный адрес API, включая его версию.
Итак, в app.js я запрашиваю метаданные системы и где-то их сохраняю. Но некоторые компоненты инициализируются до того, как этот запрос будет выполнен. Таким образом, они не обнаружат, что версия инициализирована и запрашивает неверные данные сервера.
Я хочу, чтобы конструктор app.js ждал, пока эти данные не будут получены. Например что-то вроде этого:
export class App {
async constructor(...) {
...
await this.initializeHttp();
...
}
initializeHttp(){
// get the system meta from server
}
}
но это решение не применимо. Потому что конструктор не может быть асинхронным. Итак, как мне заблокировать задание до тех пор, пока системные метаданные не будут получены?
Вопрос не является дубликатом этот вопрос. В этом вопросе во внешнем классе есть место для ожидания задания инициализации; хотя в моем вопросе основная проблема в том, куда девать этот ожидание. Таким образом, вопрос касается не только асинхронной функции в конструкторе, но и блокировки всех заданий aurelia до тех пор, пока асинхронное задание не будет разрешено.
Возможный дубликат вызов асинхронной функции в конструкторе. и Асинхронная загрузка данных в конструкторе класса и Позволит ли async/await использовать нас в конструкторах? и Конструктор класса Async/Await
@Лео, конечно, это будет возможным решением. Сделаю, если лучше не найдется. Спасибо.
@adiga, я думаю, ты не читал вопрос. Вопросы, которые вы упомянули, являются местами, где мы можем ждать на внешней стороне. Пожалуйста, прочитайте часть ОБНОВЛЕНИЕ для получения дополнительных объяснений.
@Bergi в общих местах этот намек будет принят, но в aureliajs или других платформах SPA я не создаю компоненты. Таким образом, вопрос заключается в том, что вы пропустили: как сказать aureliajs не создавать компоненты до тех пор, пока не будет разрешена асинхронная функция.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Aurelia предоставляет множество способов обработки асинхронного потока. Если ваш пользовательский элемент является маршрутизируемым компонентом, вы можете использовать activate жизненный цикл, чтобы вернуть обещание и асинхронно инициализировать службу http.
В противном случае вы можете использовать CompositionTransaction, чтобы остановить процесс, прежде чем вы закончите инициализацию. Вы можете увидеть предварительный пример на https://tungphamblog.wordpress.com/2016/08/15/aurelia-customelement-async/
Вы также можете использовать асинхронную природу функции configure при начальной загрузке приложения Aurelia, чтобы выполнить там инициализацию:
export function configure(aurelia) {
...
await aurelia.container.get(HttpServiceInitializer).initialize();
}
Спасибо, бигопон. Отличный обзор возможных решений. А как насчет этого: в app.js не настраивается маршрутизатор (а также отображается индикатор загрузки) и после выполнения асинхронных заданий добавляются маршруты к маршрутизатору.
Вероятно ошибка где-то при загрузке. Просто оберните все внутри configure fn с помощью try/catch и зарегистрируйте его для дальнейшей отладки, я полагаю
У меня было аналогичное требование к веб-приложению, и для его решения я просто загружаю данные сервера на страницу индекса, прежде чем загружать свое приложение aurelia, и помещаю его в глобальную область, чтобы я мог легко получить к нему доступ из приложения aurelia, например
window.ServerMetadata = {};