Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Error Handling com Map do Array.

Boa Tarde e Feliz Natal,

Fazendo testes aqui, queria ser capaz de logar tudo que estou fazendo, e caso algum item desse erro, queria pegar isso no catch "global" e avisar que foi processado, porém com alguns items com erro. Abaixo tento esboçar a tentativa.

O Problema é que com o erro que solto dentro do trataItem não consigo pegar no catch global. É possível fazer isso que estou querendo?

Meio que o map devolver a promise que está em cada item dele.

Obrigado.

    let controller = new TesteController();

        controller.testeController()
            .then((items: Array<number>) => {
                console.log('--Iniciando leitura dos itens--');
                items.map(item => controller.trataItem(item));
            })
            .then(() => {
                console.log('--Leitura dos itens finalizada--');
            })
            .catch((err) => {
                console.log('--Leitura com falhas--');
                console.log(err.message);
            })
export class TesteController {

    constructor() {

    }

    public testeController(){
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(new Array<number>(1,2,3,4,5,6))

            }, 2000);
        });
    }

    public trataItem(item:number) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {

                if (item === 5) {
                    reject(new Error('iiii'))
                } else {
                    console.log(item);
                }

                resolve();
            }, 300);


        });
    }
}
3 respostas
solução!

Feliz natal.

Repare que seu trataiten devolve um promise e sequer ela é encadeada ou resolvida. Está meio sem sentido ser usada no map. Basta remover a promise e lançar uma exceção com throw.

Parece que houve um overuse de promise. Estou tendo muita dificuldade para entender seu código, principalmente o map que no final retorna um array de Promises e que não é usado em nenhum lugar.

Em suma, como a promise nunca foi encadeada na promise principal a rejeição nunca será pega no catch, que foi criado para pegar exceções de Promises encadeadas.

Sucesso e bom estudo.

Professor,

Fiz a alteração sugerida e funcionou mesmo, acredito que eu fiz o trataItem com Promise porque não estava conseguindo lançar um throw dentro de um setTimeout, e fiz perder o sentido.

Alteração que fiz e deu certo:

    (...)
    public trataItem(item: number) {

        if (item === 5) {
            throw new Error(`Erro no item ${item}`);
        } else {
            console.log(item);
        }

    }
    (...)

Excelente meu aluno. Feliz 2018 pra ti!