Pesquisa de site

javascript - Promise.all não funciona no código AWS Lambda


Eu testei este código localmente várias vezes, mas após a implantação na AWS, ele parou de funcionar. Eu acabei de adicionar um código simples para testar o Promise.all, mas a função não espera de forma alguma. O que estou fazendo de errado aqui?

export const myHandler = async (event, context, callback) => {
  console.log(event)

  await getParam().then(
    (resolvedValue) => {
      createBuckets()
    },
    (error) => {
      console.log(get(error, 'code', 'error getting paramstore'))
      return { test: error }
    }
  )

  async function createBuckets() {
    console.log(`inside createbuckets`)

    const timeOut = async (t: number) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(`Completed in ${t}`)
        }, t)
      })
    }

    await timeOut(1000).then((result) => console.log(result))

    await Promise.all([timeOut(1000), timeOut(2000)])
      .then(() => console.log('all promises passed'))
      .catch(() => console.log('Something went wrong'))
  }
}

Minha função createBuckets era uma const e também uma arrow function. mas por algum motivo, mesmo assim aparecia como undefined quando eu a deployava. Quando eu mudei para function createBuckets, começou a funcionar.

Resposta #1

Como o Matt já mencionou nos comentários, você precisa return createBuckets() no callback .then para que funcione corretamente.

Eu também acho que misturar async/await e .then/.catch pode ser um pouco confuso, então é melhor seguir com um ou outro na maior parte do tempo.

Aqui está como eu reescreveria seu código:

const timeOut = (t: number) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`Completed in ${t}`)
    }, t)
  })
}

async function createBuckets() {
  console.log(`inside createbuckets`)

  const result = await timeOut(1000);
  console.log(result);

  await Promise.all([timeOut(1000), timeOut(2000)])
  console.log('all promises passed')

  // The Promise from timeOut cannot reject, so there's no point in catching it.
  // If you need to catch the error when you perform some real work, then you can 
  // use try/catch.
}

export const myHandler = async (event, context, callback) => {
  console.log(event)

  try {
    const param = await getParam()
    await createBuckets()
  } catch (error) {
    console.log(error)
    return { test: error }
  }
}