0

I have the following code in my own async function that uses another imported function from module which is a custom wrap of axios inside try/catch block:

async function getCharacter (realmSlug, characterName) {
    try {
        const [{id, name, gender, faction, race, character_class, active_spec, realm, guild, level, last_login_timestamp, average_item_level, equipped_item_level}, {pets, unlocked_battle_pet_slots},{mounts}] = await Promise.all([
            getCharacterSummary(realmSlug, characterName), -- custom axios instance
            getCharacterPetsCollection(realmSlug, characterName),
            getCharacterMountsCollection(realmSlug, characterName)
        ])
        ....
        return result;
    } catch (error) {
        console.log(error.code);
        if (error.response.status === 404 || error.response.status === 403) {
            console.error(`${getCharacter.name},${characterName}@${realmSlug}`);
        }
        return { name: characterName, realm: realmSlug }
    }
}

The problem is that if I use promise.all according to Stackoverflow 1,2 I can not handle errors. So the problem is when I call function to execute, my errors doesn't handle in (catch) block. At all. Even if I don't need print them, anyway I receive messages in console about 404 errors, but console.log(error.code) still gives me nothing. For example:

enter image description here

So is there any way to handle this annoying error messages in console somehow? For example using .catch somewhere? Or using for await ... of or rxJS instead if it's possible?

Exporting function and using .catch

Even if I export this function getCharacter in another .js file and use the following code:

const getCharacter = require('./getCharacter');

               let bulkCharacters = [{realmSlug, characterName},{realmSlug, characterName},... ,n] //array of characters for getCharacter request
               const promises = bulkCharacters.map(async ({realmSlug, characterName}) => {
                    try {
                        return await getCharacter(realmSlug, characterName);
                    } catch (e) {
                        console.log(e)
                    }
                });
                let test = await Promise.all(promises)
                    .catch(function(arrayOfPromises, err) {
                        // log that I have an error, return the entire array;
                        console.log('A promise failed to resolve', err);
                        return arrayOfPromises;
                    })
                    .then(function(arrayOfPromises) {
                        console.log(arrayOfPromises)
                    })
                ;
                console.log('stop')

I still receive errors in console, without triggering catch block inside getCharacter function or this file in which this function was imported and catch block is outside the function.

AlexZeDim
  • 3,520
  • 2
  • 28
  • 64
  • 1
    You can use `.catch()` directly on `Promise.all()` and return whatever you want. You can then throw an error after the `await Promise.all()` finishes – mhodges Feb 15 '20 at 07:16
  • @mhodges Thank you for mentioning it, but I guess, I already found the problem in imported module function that was wrapped in axios. That's why `catch` block never triggers. – AlexZeDim Feb 15 '20 at 07:23

0 Answers0