Выключэнні ў асінхронных коллбэках у JavaScript

Няхай, калі параметрам make перададзены нумар неіснуючага элемента масіва - гэта выключная сітуацыя. Як вы ўжо ведаеце, выключэнні, якія ўзніклі ўнутры асінхроннай функцыі, не могуць быць злоўлены праз try-catch. У нашым выпадку выключэнне, якое ўзнікла ўнутры make або коллбэка, не будзе злоўлена:

javascripttry {
  make(10, function(res) {
    console.log(res);
  });
} catch(err) {
  // не зловіцца
}

У коллбэк-падыходзе з выключэннямі працуюць наступным чынам: у першы параметр коллбэка адпраўляюць вынік, а ў другі - памылку. У гэтым выпадку апрацоўка памылак адбываецца наступным чынам:

javascriptmake(10, function(res, err) {
  if (!err) {
    console.log(res); // памылкі не ўзнікла, вывядзем вынік
  } else {
    console.log(err); // памылка ўзнікла, вывядзем яе тэкст
  }
});

Давайце пераробім код нашай функцыі make у адпаведнасці з апісаным:

javascriptfunction make(num, callback) {
  setTimeout(function() {
    let arr = [1, 2, 3, 4, 5];
    
    let err;
    if (arr[num] === undefined) {
      err = 'elem not exists'; // тэкст памылкі
    } else {
      err = null; // памылкі няма
    }
    
    callback(arr[num], err);
  }, 3000);
}