在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
旨在为这个食谱提供语法糖。