Если я даю Обещание, которое никогда не выполняется:
const nothingPromise = new Promise((resolve) => {});
И затем я await
это обещание в бесконечном while
цикле:
async function run() { while (true) { await nothingPromise;}}
Любая функция then()
, прикрепленная к функции, не будет работать, но я также не получаю бесконечный цикл. Я получаю ожидающее обещание. В консоли Chrome:
run().then(() => console.info('then'))
Promise {<pending>}
Почему ожидающее обещание возвращается? У меня такое ощущение, что это как-то связано с эта часть спецификации ECMAScript:
The abstract operation LoopContinues takes arguments completion and labelSet and returns a Boolean. It performs the following steps when called:
- If completion.[[Type]] is normal, return true.
- If completion.[[Type]] is not continue, return false.
- If completion.[[Target]] is empty, return true.
- If completion.[[Target]] is an element of labelSet, return true.
- Return false.
Но я не знаю, какое условие завершения соответствует await nothingPromise
.
await
отправляет функцию в спящий режим до тех пор, пока:
Итак, цикл while
запускается, обещание await
передается, и функция, которая вызывает run()
, получает обещание, возвращенное run
(которое ожидает, потому что run
спит), и продолжает работу.
Поскольку nothingPromise
никогда не разрешается, функция run
никогда не просыпается, поэтому никогда не завершается и никогда не разрешает возвращаемое обещание.
Найденная вами часть спецификации не имеет значения, поскольку await
отправляет run
в спящий режим в середине первой итерации цикла, поэтому цикл никогда не завершается.