最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

在module.exports之前等待异步函数

IT培训 admin 4浏览 0评论

在module.exports之前等待异步函数

我有一个NextJS应用程序,并使用next-routes来处理所有路由。

我的路由模块目前看起来像这样:

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-routes,我需要这个模块立即返回routes对象而不是async函数。例如

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必须在异步函数内。在执行routes对象的module.exports之前,如何完成异步API调用?

回答如下:

这是this renowned problem的一个特例。同步代码可以转换为异步,但反之亦然。

如this similar answer所示,如果需要,promises应该用于应用程序入口点:

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

此模块还会导出一个promise,因此需要将其链接到依赖于它的模块中。

有a proposal for top-level await旨在为这个食谱提供语法糖。

在module.exports之前等待异步函数

我有一个NextJS应用程序,并使用next-routes来处理所有路由。

我的路由模块目前看起来像这样:

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-routes,我需要这个模块立即返回routes对象而不是async函数。例如

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必须在异步函数内。在执行routes对象的module.exports之前,如何完成异步API调用?

回答如下:

这是this renowned problem的一个特例。同步代码可以转换为异步,但反之亦然。

如this similar answer所示,如果需要,promises应该用于应用程序入口点:

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

此模块还会导出一个promise,因此需要将其链接到依赖于它的模块中。

有a proposal for top-level await旨在为这个食谱提供语法糖。

发布评论

评论列表 (0)

  1. 暂无评论