Ожидать асинхронную функцию перед модулем. - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть приложение NextJS, и я использую next-маршруты для обработки всей маршрутизации.

Мой модуль маршрутизации в настоящее время выглядит следующим образом:

const routes = require('next-routes')();
const { getEntries } = require('../data/contentful');

module.exports = async () => {
  const globalSettings = await getEntries({
    content_type: 'globalSettings',
  });

  routes
    .add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
    .add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
    .add('home', `/`, 'index')
    .add('page', `/:slug*`, 'page'));

  return routes;
};

Я могу заставить это работать на стороне сервера, но чтобы использовать next-маршруты на стороне клиента, мне нужен этот модуль для немедленного возврата объекта маршрутов, а не асинхронной функции.Например,

const routes = require('next-routes')();
const { getEntries } = require('../data/contentful');

// Do this first, then module.exports
const globalSettings = await getEntries({
  content_type: 'globalSettings',
});

module.exports = routes
  .add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
  .add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
  .add('home', `/`, 'index')
  .add('page', `/:slug*`, 'page'));

Это не работает, потому что await должно быть внутри асинхронной функции.Как я могу завершить мой асинхронный вызов API перед выполнением моего module.exports объекта маршрута?

1 Ответ

0 голосов
/ 19 февраля 2019

Это особый случай этой известной проблемы .Синхронный код может быть преобразован в асинхронный, но не наоборот.

Как показано в этот аналогичный ответ , обещания должны использоваться вплоть до точки входа приложения, если необходимо:

module.exports = (async () => {
  const globalSettings = await getEntries({
    content_type: 'globalSettings',
  });

  return routes
  .add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
  .add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
  .add('home', `/`, 'index')
  .add('page', `/:slug*`, 'page'));
})();

Этот модуль также экспортирует обещание, поэтому его необходимо объединить в модуль, который зависит от него.

Существует предложение для верхнего уровня await, которое предназначено для предоставлениясинтаксический сахар по этому рецепту.

...