Async function javascript

5

I'm doing an API in Node.js and I have a function that I call through the post, but before I go to the precise repository I run the getProduto(idProd, produto) function, but it's doing console.log('produto -> '+ produto.nome); before executing the function getProduto(idProd, produto) .

I do not know how to make it wait for the other function to finish. I've tried adding async and await , but to no avail.

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);
}
    
asked by anonymous 08.11.2018 / 23:42

3 answers

2

await always expects the return of a Promise, signing the function getProduto to async will rather guarantee the return of a Promise by that, but this is not your problem but the internal code of the getProduto .

1 Make sure that within the getProduto function, you are returning a Promise from where the Product is retrieved.

Example:

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

2 Verify that getProduto to retrieve the Product is processing a callback function. Remember, await waits for a return Promise and callback will execute in parallel and will be ignored by await of calling function.

Example making a wrap from a callback to 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 have helped.

    
12.11.2018 / 03:46
0

To use await you need to make the function asynchronous. For this you can use 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' });
  };
};
    
09.11.2018 / 14:31
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);
}
    
09.11.2018 / 14:57