1
votes

La fonction async / await renvoie undefined?

Voici une partie de ma fonction qui doit être exécutée de manière asynchrone. pourquoi dans un endroit commenté il est indéfini, puisque la fonction renvoie une valeur. Et si mon code est incorrect, puis-je voir à quoi il devrait ressembler?

    async function addAvailableFunds(
        recipientAvailableFunds,
        amountMoney,
        recipientId,
        transferCurrencyId,
      ) {
          const convertedAmountMoney = await currencyConversion(
            transferCurrencyId,
            recipientCurrencyId,
            amountMoney,
          );

          console.log(
            'convertedAmountMoney',
            convertedAmountMoney,
          ); // undefined


  async function currencyConversion(
    transferCurrencyId,
    recipientCurrencyId,
    amountMoney,
  ) {
    console.log('transferCurrencyId', transferCurrencyId);
    console.log('recipientCurrencyId', recipientCurrencyId);
    console.log('amountMoney', amountMoney);

    await Currency.findOne({
      where: {
        id: recipientCurrencyId,
      },
    }).then(async isRecipientCurrencyId => {
      if (isRecipientCurrencyId) {
        const mainCurrency = isRecipientCurrencyId.main_currency;
        const recipientCurrencyExchangeRate =
          isRecipientCurrencyId.currency_exchange_rate;

        console.log('mainCurrency', mainCurrency);
        console.log(
          'recipientCurrencyExchangeRate',
          recipientCurrencyExchangeRate,
        );

        await Currency.findOne({
          where: {
            id: transferCurrencyId,
          },
        }).then(isTransferCurrencyId => {
          if (isTransferCurrencyId) {
            const transferCurrencyExchangeRate =
              isTransferCurrencyId.currency_exchange_rate;

            console.log(
              'transferCurrencyExchangeRate',
              transferCurrencyExchangeRate,
            );

            if (mainCurrency) {

              const convertedAmountMoney =
                (amountMoney / transferCurrencyExchangeRate) *
                recipientCurrencyExchangeRate;
              console.log('convertedAmountMoney', convertedAmountMoney);
              return convertedAmountMoney; // return number
            }
          }
        });
      }
    });
  }

console.log renvoie un nombre donc je ne sais pas ce qui se passe. console.log renvoie un nombre donc je ne sais pas ce qui se passe.


2 commentaires

Puisque vous utilisez await , vous ne devez pas utiliser puis .


Veuillez modifier votre exemple de code juste assez pour illustrer le problème que vous rencontrez. Merci.


3 Réponses :


1
votes

Vous mélangez le modèle Promise puis avec celui de async / await .

Ce sont deux modèles de codage différents et incompatibles. wait renvoie une valeur non-Promise (uniquement dans le contexte d'une fonction async ), mais then ne renvoie jamais autre chose qu'une autre promesse. < / p>

Utilisez async / await ou Promises, mais pas les deux dans la même logique.


0 commentaires

0
votes

À l'intérieur de votre currencyConversion , vous mélangez deux approches pour gérer les fonctions qui renvoient des promesses.

Vous faites:

attendez Currency.findOne (... params ..). then (... params ..);

Bien que vous souhaitiez faire ce qui suit car vous utilisez la syntaxe async / await :

let isRecipientCurrencyId = await Currency.findOne(...params..);
...rest of the code..

fonction asynchrone


0 commentaires

0
votes

convertAmountMoney n'a pas été défini car rien n'a été renvoyé dans currencyConversion . Vous êtes retourné dans un .then dans une autre promesse, mais currencyConversion lui-même n'a rien retourné.

J'ai corrigé votre code ci-dessous afin de devenir complètement asynchrone / wait , mais il y a trois autres que vous devrez gérer vous-même, car à partir de maintenant vous n'avez pas précisé quoi faire à ce moment-là. J'ai ajouté trois avertissements à ce sujet.

async function addAvailableFunds(
  recipientAvailableFunds,
  amountMoney,
  recipientId,
  transferCurrencyId,
) {
  const convertedAmountMoney = await currencyConversion(
    transferCurrencyId,
    recipientCurrencyId,
    amountMoney,
  );

  console.log(
    'convertedAmountMoney',
    convertedAmountMoney,
  ); // undefined
}


async function currencyConversion(
  transferCurrencyId,
  recipientCurrencyId,
  amountMoney,
) {
  console.log('transferCurrencyId', transferCurrencyId);
  console.log('recipientCurrencyId', recipientCurrencyId);
  console.log('amountMoney', amountMoney);

  const isRecipientCurrencyId = await Currency.findOne({
    where: {
      id: recipientCurrencyId,
    },
  })
  if (isRecipientCurrencyId) {
    const mainCurrency = isRecipientCurrencyId.main_currency;
    const recipientCurrencyExchangeRate =
      isRecipientCurrencyId.currency_exchange_rate;

    console.log('mainCurrency', mainCurrency);
    console.log(
      'recipientCurrencyExchangeRate',
      recipientCurrencyExchangeRate,
    );

    const isTransferCurrencyId = await Currency.findOne({
      where: {
        id: transferCurrencyId,
      },
    })

    if (isTransferCurrencyId) {
      const transferCurrencyExchangeRate =
        isTransferCurrencyId.currency_exchange_rate;

      console.log(
        'transferCurrencyExchangeRate',
        transferCurrencyExchangeRate,
      );

      if (mainCurrency) {
        const convertedAmountMoney =
          (amountMoney / transferCurrencyExchangeRate) *
          recipientCurrencyExchangeRate;
        console.log('convertedAmountMoney', convertedAmountMoney);
        return convertedAmountMoney; // return number
      }
      console.warn('Will return undefined');
    }
    console.warn('Will return undefined');
  }
  console.warn('Will return undefined');
}


0 commentaires