Aureliajs ждет данных в конструкторе приложений - PullRequest
5 голосов
/ 18 марта 2019

Я занимаюсь разработкой приложения в aureliajs.Процесс разработки начинается в течение многих месяцев, и теперь внутренние разработчики хотят сделать свои сервисы версионными.Итак, у меня есть веб-служба для вызова версии каждого серверного приложения (веб-API), а затем, для дальнейших запросов, вызываю правильный адрес API, включая его версию.

Итак, в приложении.js Я запрашиваю системную мету и где-то ее храню.Но некоторые компоненты инициализируются до выполнения этого запроса.Поэтому они не найдут инициализированную версию и запросят неверные данные сервера.

Я хочу заставить конструктор app.js ждать, пока эти данные не будут получены.Например, что-то вроде этого:

export class App {
  async constructor(...) {
    ...

    await this.initializeHttp();

    ...
  }

  initializeHttp(){
    // get the system meta from server
  }
}

, но это решение не применимо.Потому что конструктор не может быть асинхронным.Так как мне заблокировать задание до получения системной мета?

ОБНОВЛЕНИЕ

Вопрос не является дубликатом этого вопроса .В этом вопросе во внешнем классе есть место для задания инициализации;хотя в моем вопросе главная проблема в том, где поставить это ожидание.Таким образом, вопрос заключается не только в асинхронной функции в конструкторе, но и в блокировании всех заданий aurelia до разрешения асинхронного задания.

1 Ответ

2 голосов
/ 23 марта 2019

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();
}
...