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:

  1. vi har en fil kaldet config.ts

  2. Traditionelt har config.ts indeholdt et objekt med relevante runtime-konfigurationer som standardeksport

    dette lader os simpelthen import config fra '../config' eller hvad som helst

  3. Vores konfigurations- og hemmelighedsstyring er blevet mere kompleks, så den skal foretage forskellige opkald til forskellige hemmelighedsarkiver (AWS, Azure osv.)

  4. 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:

  1. import config fra '../config' giver undefined, med export default buildConfig()
  2. at ændre eksporten til blot export default basicValues giver 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);

Relaterede artikler