Async Function javascript

Asked

Viewed 125 times

5

I am making an API in Node.js and I have a function I call through the post, but before forwarding to the precise repository I run the function getProduto(idProd, produto), but is doing the console.log('produto -> '+ produto.nome); before performing the function getProduto(idProd, produto).

I don’t know how to make him wait for the other function to end. I’ve tried adding the async and the await , but without success.

exports.postItemProduto = async function (req, res) {
    try {
        var idProd = req.body.produtoPrincipal;

        await getProduto(idProd, produto);

        console.log('produto -> '+ produto.nome);

       ...
    } catch (err) {
        console.log(err);
        return res.status(400).send({
            error: 'Erro criar item'
        });
    };
};

function getProduto(id, produto){
    ....
    console.log('getproduto -->' + produto.nome);
}
  • But the getProduto is asynchronous ? If yes also presisa async

  • Was any of the answer helpful? Don’t forget to choose one and mark it so it can be used if someone has a similar question!

3 answers

2

await always awaits the return of a Promise, sign the function getProduto for async will rather ensure the return of a Promise for this, but that is not your problem but the internal code of the function getProduto.

1 Check if from within the function getProduto, you are returning a Promise from where is recovered the Product.

Example:

const getProduto = async (id, produto) => {
...
  console.log(`getproduto --> ${produto.nome}`);
  return repositorio.retornarProduto(id).then(prod => {id: prod.id, nome: prod.nome})
};

2 Check whether getProduto to recover the Product, is processing a function callback. Remember, await awaits a return Promise and callback will run in parallel and will be ignored by await of the calling function.

Example by wrapping a callback for a Promise:

const getProduto = async (id, produto) => {
...
  console.log(`getproduto --> ${produto.nome}`);

  return new Promise((resolve, reject) => {
    repositorio.retornarProduto(id, function(produtoRetornado, erro){
       if(erro) reject(erro);
       else resolve(produtoRetornado);
    })
  });

};

I hope I’ve helped.

  • I didn’t understand why I was negatived by what I posted. We can explain myself?

0

To use the await you need to make the function asynchronous. For this you can use the async:

const getProduto = async (id, produto) => {
  ...
  console.log(`getproduto --> ${produto.nome}`);
};

exports.postItemProduto = async (req, res) => {
  try {
    const { body: { produtoPrincipal: idProd } } = req;

    await getProduto(idProd, produto);

    console.log(`produto -> ${produto.nome}`);
    ...
  } catch (err) {
    console.log(err);
    return res.status(400).send({ error: 'Erro criar item' });
  };
};

0

As every async function returns a Promise, you can do:

exports.postItemProduto = function (req, res) {
    try {
        var idProd = req.body.produtoPrincipal;

        getProduto(idProd, produto).then(() => console.log('produto -> '+ produto.nome));

       ...
    } catch (err) {
        console.log(err);
        return res.status(400).send({
            error: 'Erro criar item'
        });
    };
};

async function getProduto(id, produto){
    ....
    console.log('getproduto -->' + produto.nome);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.