Javascript/Typescript Eksporter Standard Const som værdi fra asynkron funktionskald
Jeg har læst en masse, men har ikke fundet en fungerende løsning
det tætteste jeg har set er her: Eksporter resultatet af asynkron funktion i React
venligst husk, at jeg ønsker at eksportere et objekt, og det objekt er resultatet af en asynkron funktion, IKKE at eksportere selve definitionen af den asynkrone funktion
her er mit brugsscenarie og implementering indtil videre:
vi har en fil kaldet config.ts
Traditionelt har config.ts indeholdt et objekt med relevante runtime-konfigurationer som standardeksport
dette lader os simpelthen
import config fra '../config'eller hvad som helstVores konfigurations- og hemmelighedsstyring er blevet mere kompleks, så den skal foretage forskellige opkald til forskellige hemmelighedsarkiver (AWS, Azure osv.)
Jeg har omskrevet config.ts, så den nu ser sådan ud:
export const basicValues = {
color1: 'red'
}
async function buildConfig(){
const valuesOut = {...basicValues}
valuesOut.color2 = await getSecret('color2');
valuesOut.color3 = await getSecret('color3');
return valuesOut;
}
export default buildConfig()
hvor getSecret er en funktion, der foretager et vilkårligt asynkront kald
Jeg eksporterer basicValues ovenfor, fordi jeg har nogle konfigurationsindstillinger derinde, som er nødvendige for at kunne foretage opkald inde i getSecret.
ved at eksportere basicValues sådan her kan jeg få værdierne ud med en simpel const basicConfig=require('../config').basicValues. På denne måde kan vi fortsætte med at administrere alt det sjove konfigurationsstuff i en ren, centraliseret, testet fil, men stadig gøre værdierne tilgængelige for brug meget tidligt og undgå cykliske afhængigheder
alt i alt føles det her, som om det burde virke
Jeg har prøvet mange andre mønstre, men dette føles mest naturligt og intuitivt at læse
her er den dårlige del:
import config fra '../config'giver undefined, medexport default buildConfig()- at ændre eksporten til blot
export default basicValuesgiver os vores konfigurationsobjekt som forventet (men uden de asynkrone værdier udfyldt, naturligvis)
hvad præcis gør jeg forkert her?
glad for at give flere detaljer efter behov
på forhånd tak
Svar #1
venligst husk, at jeg ønsker at eksportere et objekt, og det objekt er resultatet af en asynkron funktion, IKKE at eksportere selve definitionen af den asynkrone funktion
Dette er ikke muligt. Da værdien hentes asynkront, skal alle moduler, der bruger værdien, først vente på, at den asynkrone handling er fuldført - dette vil kræve eksport af et Promise, der løser sig til den værdi, du ønsker.
I nye versioner af Node kunne du importere Promise og bruge top-level await for at vente på, at den blev udfyldt:
import buildConfigProm from '../config';
const config = await buildConfigProm;
Hvis du ikke er i Node, understøttes top-level await ikke. Du kunne kalde .then på Promise overalt, hvor det importeres:
buildConfigProm.then((config) => {
// put all the module's code in here
});
Hvis du ikke kan lide det, er det eneste reelle alternativ at bruge afhængighedsinjektion. Lad dine moduler eksportere funktioner, der tager config som en parameter, f.eks.:
// useConfig.ts
export default (config: Config) => {
console.log('color2', config.color2);
};
På denne måde er det eneste, der skal være asynkront, indgangspunktet, som venter på, at Promisen bliver løst, og derefter kalder de nødvendige moduler med den:
// index.ts
import buildConfigProm from './config';
import useConfig from './useConfig';
buildConfigProm
.then((config) => {
useConfig(config);
})
.catch(handleErrors);
