Aureliajs ожидает данных в конструкторе приложений

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

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

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

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

    await this.initializeHttp();

    ...
  }

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

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

ОБНОВИТЬ

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

У меня было аналогичное требование к веб-приложению, и для его решения я просто загружаю данные сервера на страницу индекса, прежде чем загружать свое приложение aurelia, и помещаю его в глобальную область, чтобы я мог легко получить к нему доступ из приложения aurelia, например window.ServerMetadata = {};

Leo 18.03.2019 18:13
Не выполняйте асинхронные HTTP-запросы в своем конструкторе. Выполнить их до при построении экземпляра.
Bergi 18.03.2019 20:20

@Лео, конечно, это будет возможным решением. Сделаю, если лучше не найдется. Спасибо.

ConductedClever 25.03.2019 06:37

@adiga, я думаю, ты не читал вопрос. Вопросы, которые вы упомянули, являются местами, где мы можем ждать на внешней стороне. Пожалуйста, прочитайте часть ОБНОВЛЕНИЕ для получения дополнительных объяснений.

ConductedClever 25.03.2019 06:39

@Bergi в общих местах этот намек будет принят, но в aureliajs или других платформах SPA я не создаю компоненты. Таким образом, вопрос заключается в том, что вы пропустили: как сказать aureliajs не создавать компоненты до тех пор, пока не будет разрешена асинхронная функция.

ConductedClever 25.03.2019 06:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
6
206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 не настраивается маршрутизатор (а также отображается индикатор загрузки) и после выполнения асинхронных заданий добавляются маршруты к маршрутизатору.

ConductedClever 25.03.2019 10:54

Вероятно ошибка где-то при загрузке. Просто оберните все внутри configure fn с помощью try/catch и зарегистрируйте его для дальнейшей отладки, я полагаю

bigopon 26.03.2019 11:12

Другие вопросы по теме