Home > OS >  Javascript condition to use await of not
Javascript condition to use await of not

Time:08-24

Is there a way I can write this block of code without all the repeated code for calling axios?

export const handler = async (event, useAwait) => {
  const { path, data } = JSON.parse(event);

  if (useAwait) {
    return await axios(`https://example.com/api${path}`, {
      method: 'post',
      headers: {
        'api-key': key,
      },
      data: data,
    });
  } else {
    // non-blocking
    axios(`https://example.com/api${path}`, {
      method: 'post',
      headers: {
        'api-key': key,
      },
      data: data,
    });
    return true;
  }
};

CodePudding user response:

Put the promise into a variable, and then you can conditionally return it.

export const handler = async (event, useAwait) => {
    const { data } = JSON.parse(event);
    const prom = axios(`https://example.com/api${url}`, {
        method: 'post',
        headers: {
            'api-key': key,
        },
        data: data,
    });
    return useAwait ? (await prom) : true;
};

That said, you may as well return the Promise itself - awaiting something that you're returning immediately doesn't help since you're not immediately inside a try.

return useAwait ? prom : true;

But calling this function without returning the result looks like a bad idea because then you may get an unhandled rejection. You may wish to add a .catch to the Promise in that case to avoid that.

CodePudding user response:

export const handler = (event) => {
  const { path, data } = JSON.parse(event);
  const prom = axios(`https://example.com/api${path}`, {
      method: 'post',
      headers: {
        'api-key': key,
      },
      data: data,
  });
  prom.catch(()=>{}); // prevent uncaught rejection
  return prom;
}

If you don't test the return value of handler to be strictly equal to true, calling code can rely on promise objects being truthy in a conditional expression as needed, and the logic can be simplified to an ordinary function that returns a promise without using await or taking a useAwait parameter.

The dummy catch handler added to prom is to prevent generating an uncaught-rejected-promise error if the caller doesn't handle rejection of the axios promise. How calling code is meant to operate without waiting for the axios call completed is unclear and not covered here.

  • Related