#async-await-promises

1 messages · Page 1 of 1 (latest)

open nebula
#

Hola buenos días, tengo un problema con este código... No puedo declarar un async dentro de una Promesa, entonces me gustaría saber la mejor forma de solucionar esto y ejecutar estas promesas con .PromiseAll() más abajo.

const massiveSender = async (client, tokenId, data) => {
  const promises = data.map(async (tx) => {
    return new Promise(async (resolve, reject) => {
      try {
        let tokenTransferTx = await new TransferTransaction().addNftTransfer(
          tokenId,
          tx.SerialNumber,
          tx.SenderAccount,
          tx.ReceiverAccount
        );
        const tokenTransferTxSubmit = await tokenTransferTx.execute(client);
        const tokenTransferTxReceipt = await tokenTransferTxSubmit.getReceipt(
          client
        );
        console.log(
          "Sended NFT to" +
            tx.ReceiverAccount +
            " STATUS: " +
            tokenTransferTxReceipt.status +
            "\n"
        );
        resolve();
      } catch (error) {
        console.log(error);
        reject();
      }
    });
  });
  Promise.all(promises)
    .then(() => {
      console.log("All NFTs were sent successfully");
    })
    .catch((error) => {
      console.log("Some NFTs were not sent successfully:  ", error);
    });
};
shadow quiver
#

vamos a ver

open nebula
shadow quiver
#

una manera de imaginar esto es utilizando todo async/await excluyendo el Promise

const operation = async (tx) => {}

const bulk = async (data = []) => {
    const logs = []

    for (let i = 0; i < data.length; i++) {
        const tx = data[i];
        try {
            const step1 = await operation(tx);
            // ...
            logs.push(`tx ${i}`);
        } catch (error) {
            logs.push(`tx ${i}, error: ${error}`);
        }
    }
}
#

si no tienes que lidiar con callback puedes evitar el uso de new Promise(...)

open nebula
#

Pero si evito el uso de new Promise() no puedo ejecutar Promise.all más abajo 😦

shadow quiver
#

ah, eso es un requisito ?

open nebula
#

Diría que si, ya que necesito que una espere por la anterior para ser ejecutada

#

No sé si hay alguna forma mejor de hacerlo eh

shadow quiver
#

al hacer un for en una funcion async
el codigo const step1 = await operation(tx);
es sequential (espera la ejecucion)

#

el prototipo que te acabo de pasar, si data contiene 1000 elementos,
esos 1000 elementos se ejecutan uno detrás del otro

#

(por efecto del await)

#

pero se puede hacer como dices, tu hay solo que dar una vuelva mas, espera

open nebula
#

Esto podría valer?

#

Ya que al final await devuelve una Promise?

shadow quiver
#

pero ese map no devuelve nada

#

que hay en promises si haces eso?

open nebula
shadow quiver
open nebula
#

Pero nah... por qué claro no puedo lanzar reject() para que lo capture el catch de Promise.all fuc

#

Joder que dificil es esto jaja 😦

shadow quiver
#

este es el prototipo con Promise.all

#

const operation = (tx) => new Promise((resolve, reject) => {
    resolve(tx * 2)
})

const bulk = (data) => {
    return Promise.all(data)
}

const data = [
    operation(1),
    operation(2),
    operation(3),
    operation(4),
    operation(5),
    operation(6),
]

bulk(data).then((result) => {
    console.log(result)
})
#

osea,

#

a la base de todo esta una operacion (una función que devuelve una promise...)

en tu caso, esa funcion ejecuta, en una Promise esto

      try {
        let tokenTransferTx = await new TransferTransaction().addNftTransfer(
          tokenId,
          tx.SerialNumber,
          tx.SenderAccount,
          tx.ReceiverAccount
        );
        const tokenTransferTxSubmit = await tokenTransferTx.execute(client);
        const tokenTransferTxReceipt = await tokenTransferTxSubmit.getReceipt(
          client
        );
        console.log(
          "Sended NFT to" +
            tx.ReceiverAccount +
            " STATUS: " +
            tokenTransferTxReceipt.status +
            "\n"
        );
        resolve();
      } catch (error) {
        console.log(error);
        reject();
      }
open nebula
#

Si eso es, el problema viene que si no le especifico en mi map el async no puedo hacer await donde lo necesito 😦

shadow quiver
#

(en realidad si lo puede hacer, pero te da un error el linter)
y lo hace por una buena razon...
es mejor utilizar el paradigma dependency injection a un new Promise(async

open nebula
#

Ostia.. eso del dependency injection no se que es jaja

shadow quiver
#

simplemente le das la vuelta a la tortilla, creando una función externa, que acepta todos los parametros que necesitas y que devuelve una promise

#

a ese punto el map te vuelve a funcionar

#

intentalo, crea una funcion, que recibe tx como parametro

open nebula
#

Vale perfecto muchas gracias!

open nebula
#

@shadow quiver He encontrado una solución viendo uno de los YouTube de Midu.. que sería englobar a todo dentro de una IIFE

#
const massiveSender = (client, tokenId, data) => {
  const promises = data.map(async (tx) => {
    return new Promise((resolve, reject) => {
      (async () => {
        try {
          let tokenTransferTx = await new TransferTransaction().addNftTransfer(
            tokenId,
            tx.SerialNumber,
            tx.SenderAccount,
            tx.ReceiverAccount
          );
          const tokenTransferTxSubmit = await tokenTransferTx.execute(client);
          const tokenTransferTxReceipt = await tokenTransferTxSubmit.getReceipt(
            client
          );
          console.log(
            "Sended NFT to" +
              tx.ReceiverAccount +
              " STATUS: " +
              tokenTransferTxReceipt.status +
              "\n"
          );
          resolve();
        } catch (error) {
          console.log(error);
          reject();
        }
      })();
    });
  });

Promise.all(promises)
    .then(() => {
      console.log("All NFTs were sent successfully");
    })
    .catch((error) => {
      if (error.status.Status._code === 184) {
        throw new Error("Token No Asociado");
      }
      console.log("Some NFTs were not sent successfully:  ", { error });
    });
};
#

Así me funciona perfect

#

Una última pregunta @shadow quiver y ya te dejo tranquilo jaja , para acceder a: ese Error al código

#

No sería.. error.status.Status._code

#

?

open nebula
#

Listo solucionado tmb!

#

Gracias por todo!

zinc fox
#

hola, no se si es el lugar correcto para preguntar, pero soy nuevo en JavaScript y estoy teniendo problemas, tengo un array de productos que quiero importar de un json con fetch y luego que se imprima en el doom

#

pero hay veces que no me carga el array, aunque tengo el async, como no me funciona no se si estoy haciendo bien jajaj

#

eso es lo que tengo