Получить данные с помощью await async без try catch - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь использовать await-async без try-catch для этого:

const getUsers = async (reject, time) => (
  new Promise((resolve, reject) => {
    setTimeout(() => {
      if (reject) {
        reject(....)
      }
      resolve(.....);
    }, time);
  })
);

module.exports = {
  getUsers ,
};

С блоком try-catch это выглядит так:

const { getUsers } = require('./users');

const users = async () => {
  try {
    const value = await getUsers(1000, false);
    .....
  } catch (error) {
    .....
  }
}

users();

Как написать тот же код без использования блока try-catch?

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Используя функции обещания then-catch для упрощения процесса, я использую следующие утилиты:

// utils.js

const utils = promise => (
  promise
    .then(data => ({ data, error: null }))
    .catch(error => ({ error, data: null }))
);

module.exports = utils;

А потом

const { getUsers } = require('./api');
const utils = require('./utils');

const users = async () => {
  const { error, data } = await utils(getUsers(2000, false));
  if (!error) {
    console.info(data);
    return;
  }
  console.error(error);
}

users();

Без использования блока try-catch, я получил тот же вывод, таким образом, это облегчает понимание кода.

0 голосов
/ 08 июня 2019

Пакет, который я нашел под названием await-to-js , также может ему помочь.

import to from 'await-to-js';

const [err, users] = await to(getUsers());
if(err) doSomething();

Идея похожа на метод Лиеса Чио, просто обертка. Скопировал исходный код сюда.

/**
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @return { Promise }
 */
export function to<T, U = Error> (
  promise: Promise<T>,
  errorExt?: object
): Promise<[U | null, T | undefined]> {
  return promise
    .then<[null, T]>((data: T) => [null, data])
    .catch<[U, undefined]>((err: U) => {
      if (errorExt) {
        Object.assign(err, errorExt);
      }

      return [err, undefined];
    });
}

export default to;
0 голосов
/ 07 мая 2018

Если у вас есть допустимое значение по умолчанию для случая ошибки, вы можете использовать метод catch в обещании getUsers, а затем await обещание, ошибка которого будет обработана

const users = async () => {
    const value = await getUsers(1000, false).catch(e => null);
}

Хотя этот подход должен работать, следует отметить, что он может маскировать случай, когда getUsers возвращает null против того, когда возникает ошибка, и вам все равно нужно будет проверить наличие null или получить нулевой доступ ошибка. В общем, я бы придерживался try { .. } catch (e) { ... } для большинства случаев

...