Неразрешенные обещания не будут блокировать выход из процесса. Взгляните на this .
Пока есть решенное обещание и цепочка, следующая за ним, процесс будет продолжаться. Поскольку вы вызываете s.send()
пару раз перед for await
, первые две итерации в l oop разрешили обещания и, следовательно, больше кода для запуска. После этого он ожидает невыполненного обещания, что делает ваш звонок на (async () => { ... })()
неразрешенным обещанием. Когда код больше не выполняется, процесс завершается.
Чтобы обойти это, вы можете сделать что-нибудь неприятное, например setInterval(() => {}, 999999999)
. Пока запланировано время ожидания, процесс не завершится.
Мне потребовалось некоторое время, чтобы выяснить, в каком случае мы хотели бы иметь такое поведение - не дожидаясь, пока все обещания не будут решены или отклонены, прежде чем выход.
let p1 = Promise.resolve(1),
p2 = new Promise(() => {}).then(Promise.resolve(2)),
p3 = Promise.race([p1, p2]).then(console.log);
p2
никогда не разрешится, и вызов p3
Promise.race()
не отменяет p2
* then()
. Однако мы ожидаем, что эта программа напечатает 1
и затем завершится.