Javascript Не удается отловить ошибку внутри функции карты - PullRequest
1 голос
/ 04 марта 2020

скажем, у меня есть список пользователей, подобный этому:

var usersList = [
            { firstName : 'Adam', lastName: 'Yousif', age: 23 },
            { firstName : 'Mohamed', lastName: 'Ali' },
            { firstName : 'Mona', lastName: 'Ahmed', age: 19 },
        ];

Теперь я хочу вызвать функцию map для списка пользователей и вернуть измененный список, например:

var returnList = usersList.map((_user) => {
            var _age;
            try {
                _age = _user.age;
            } catch (error) {
                console.log('I caught error here : ', error); // <-- not printed
                _age = 'FAILSAFE-VAULE'; // <-- not set
            }
            var obj = {
                firstName: _user.firstName,
                lastName: _user.lastName,
                age: _age
            }
            return obj;
        });

У меня есть Блок try-catch внутри функции map, цель которого - заменить неопределенное свойство "age" второго пользователя на 'FAILSAFE-VALUE'. но он не работает как следует.

console.log(returnList);
// prints
// [ 
//     { firstName: 'Adam', lastName: 'Yousif', age: 23 },
//     { firstName: 'Mohamed', lastName: 'Ali', age: undefined }, <-- not what I want
//     { firstName: 'Mona', lastName: 'Ahmed', age: 19 } 
// ]

Как отловить ошибку внутри javascript функции карты?

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Вам не нужно пытаться ловить для этого:

usersList.map((_user) => {
            return {
                firstName: _user.firstName,
                lastName: _user.lastName,
                age: _user.age || 'FAILSAFE-VAULE'
            };
        });
1 голос
/ 04 марта 2020
Блок

try...catch не будет работать там, так как после доступа к несуществующему значению вы просто получите undefined

, просто сделайте это следующим образом:

var returnList = usersList.map((_user) => {
    return {
        firstName: _user.firstName,
        lastName: _user.lastName,
        age: _user.age ? _user.age  : 'FAILSAFE-VAULE'
    }
});
0 голосов
/ 04 марта 2020

Это потому, что ничего не выброшено (age это просто undefined). Если вы хотите получить информацию об этой «ошибке» во время операции map, первая часть фрагмента может быть идеальной. Если вы действительно хотите использовать try - catch, используйте вторую часть (она выдает «вручную», когда _user.age равно undefined). Последний демонстрирует (кстати), что try - catch работает в рамках map -операции.

const usersList = [{
    firstName: 'Adam',
    lastName: 'Yousif',
    age: 23
  },
  {
    firstName: 'Mohamed',
    lastName: 'Ali'
  },
  {
    firstName: 'Mona',
    lastName: 'Ahmed',
    age: 19
  },
];

const getFailSafe = user => {
  if (!user.age) {
    console.log(`Note: user.age not available for ${user.firstName} ${user.lastName}`);
    return `FAILSAFE-VAULE`;
  }
  return user.age;
};

// 1. use a warning if .age not present
const returnList = usersList
  .map((_user) => ({
      firstName: _user.firstName,
      lastName: _user.lastName,
      age: getFailSafe(_user)
    })
);

// 2. throw an Error if .age not present
const returnListWithError = usersList
  .map((_user) => {
    let retVal = {
      firstName: _user.firstName,
      lastName: _user.lastName,
    }
    try {
      retVal.age = _user.age || 
        (() => {
          throw new Error(`ERROR: user.age not available for ${
            _user.firstName} ${_user.lastName} (will continue with 'FAILSAFE-VAULE')`);
          })();
    } catch (err) {
      console.log(`${err.message}`);
      retVal.age = `FAILSAFE-VAULE`;
    }
    
    return retVal;
  });

console.log(returnList.find(v => isNaN(v.age)));
console.log(returnListWithError.find(v => isNaN(v.age)));
.as-console-wrapper { top: 0; max-height: 100% !important; }
...