Невозможно выбросить ошибку из функции выполнения асинхронного обещания

Я пытаюсь понять концептуальное понимание того, почему следующий код не поймает throw . Если вы удалите ключевое слово async из new Promise(async (resolve, ... то он отлично работает, поэтому он связан с тем, что исполнитель Promise является асинхронной функцией.

 (async function() { try { await fn(); } catch(e) { console.log("CAUGHT fn error -->",e) } })(); function fn() { return new Promise(async (resolve, reject) => { // ... throw new Error("<>"); // ... }); } 

Ответы здесь , здесь и здесь повторяют: «Если вы используете какой-либо другой asynchronous обратный вызов, вы должны использовать reject », но «асинхронным» они не относятся к async функциям, поэтому я не думаю, что их объяснения применяются здесь (и если они это сделают, я не понимаю, как).

Если вместо throw мы используем reject , приведенный выше код работает нормально. Я хотел бы понять, в принципе , почему throw здесь не работает. Благодаря!

Это версия async / wait Promise конструктора Promise !

Никогда не используйте функцию async function как функцию исполнителя Promise (даже если вы можете заставить ее работать 1 ) !

[1: путем вызова resolve и reject вместо использования операторов return and throw ]

«асинхронно» они не имеют отношения к async функциям, поэтому я не думаю, что их объяснения применимы здесь

Они тоже могли. Простой пример, когда он не может работать

 new Promise(async function() { await delay(…); throw new Error(…); }) 

что эквивалентно

 new Promise(function() { return delay(…).then(function() { throw new Error(…); }); }) 

где теперь ясно, что throw находится внутри асинхронного обратного вызова.

Конструктор Promise может улавливать только синхронные исключения, а async function никогда не бросает – он всегда возвращает promise (которое может быть отклонено, хотя). И это возвращаемое значение игнорируется, поскольку promise ожидает resolve .

Давайте будем гением компьютера.