Есть несколько проблем с вашим кодом, давайте рассмотрим их по очереди:
Во-первых
Когда вы отображаете свой массив lists
, вы никогда не вернете обещание, которое вы получили отваша sleep()
функция.Это означает, что вы предоставляете Promise.all()
массив, заполненный undefined
.Promise.all()
рассматривает значения, которые не являются обещаниями, как разрешенное обещание, поэтому ваше Promise.all()
всегда будет разрешаться независимо от того, разрешают или отклоняют обещания, созданные sleep()
.Это также означает, что ничто не ловит отклоненное обещание от sleep()
, и именно поэтому ваш сценарий в настоящее время получает необработанные отклонения обещания.
Вы исправляете это, возвращая обещание правильно с помощью return sleep(record)
.Но этого будет недостаточно, чтобы избавиться от всех необработанных отклонений обещаний, поэтому давайте двигаться дальше ...
Во-вторых
Вы завернули свои вызовы на sleep()
в блоке try-catch
,Если вы не используете async-await
, блок try-catch
будет , а не ловить отклоненные обещания.В этом случае он будет отлавливать только ошибки, возникшие при создании обещания.Это нормально, если это было ваше намерение, но если вы хотели поймать отклоненные обещания, это не сработает.
В-третьих
Вы подключили обработчик catch()
к вашему Promise.all()
,В отличие от вышеупомянутого try-catch
, он фактически заботится о любых отклоненных обещаниях.Однако вы повторно выдает ошибку в этом обработчике, что означает, что цепочка обещаний все равно будет отклонена.Вы завернули Promise.all()
в другой блок try-catch
, но, как уже упоминалось, это не позволяет отменить отклоненные обещания, поэтому все еще отклоненное обещание в конечном итоге будет обработано.
В этом случае вам просто не следует повторно выбрасыватьошибка в вашем последнем обработчике catch()
, так как я не вижу в этом смысла.Если вам по какой-либо причине необходимо перебросить его, вам нужно добавить еще один обработчик catch()
позже в цепочке.