J'essaie de comprendre comment les promesses, les rappels, etc. fonctionnent dans node.js, en particulier dans le cas de l'accès à la valeur en dehors de la fonction. J'ai passé du temps à parcourir les réponses ici Comment faire Je renvoie la réponse d'un appel asynchrone? et ici appelez l'API Stripe avec await, mais chaque variante que j'essaie, je me retrouve toujours avec un 'abonnement' en dehors de la fonction comme non défini.

Merci

let subscription;
async function getSub(){
    subscription = await stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv');
    // code here only executes _after_ the request is done?
    return subscription
}
getSub()
console.log("subscription: ", subscription) // subscription undefined??
0
quietplace 30 août 2020 à 09:07

2 réponses

Meilleure réponse

Il existe 2 façons d'obtenir une réponse

getSub()
.then(subscription => {
    console.log("subscription: ", subscription);
});

Ou

const funcA = async() {
    const subscription  = await getSub();
    console.log("subscription: ", subscription);
}
funcA();
2
r7r 30 août 2020 à 06:47

Le code écrit après la fonction asynchrone est exécute APRÈS la fonction de synchronisation mais se fait AVANT la fonction asynchrone afin qu'il ne soit pas défini comme défini dans la première ligne let subscription // undefined

Permet de le couper en morceaux et de numéroter la chronologie des événements:

1. let subscription;
2. async function getSub(){
    5. subscription = await stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv');
    // code here only executes _after_ the request is done?
    6. return subscription
}
3. getSub()
4. console.log("subscription: ", subscription) // subscription undefined??

Comme vous pouvez le voir, le journal de la console se produira AVANT l'attribution car 2. prend plus de 3. et 4. en raison de 5. dedans.

Vous devriez faire quelque chose comme ça:

(async () => {
  const sub = await stripe.subscriptions.retrieve('sub_HurxwcQoCIH7jv')
  console.log(sub) //
})()

Vous pouvez également nommer la fonction:

const functionWithSomeName = async () => {
  const sub = await ...CODE HERE...
  console.log(sub)
}

functionWithSomeName()
2
Raz 30 août 2020 à 07:11