И вот однажды ты можешь задаться именно этим вопросом: «Как вручную разрешить JavaScript Обещание (Promise), не прописывая заранее логику в функции исполнителя?».
Всё что тебе нужно, это вытащить наружу функцию разрешения из функции исполнителя для конкретного объекта Обещания. Для этого нужно создать любой внешний контейнер, будь то имя переменной или ключ объекта.
console.log(`Начало`); let r; let pr = new Promise((resolve, reject)=>{r = resolve}); Promise.all([pr]).then(arr=>{console.log(`Все обещания выполнены`)}); setTimeout(r, 3000); console.log(`Конец`);
В переменную «r
» мы присваиваем функцию разрешения из исполнителя под наше Обещание. Само же Обещание лежит в переменной «pr
«. Конкретно в этом примере эти переменные лежат на одном уровне видимости.
Мы хотим дождаться выполнения Обещания, которое само по себе никогда не выполнится изнутри. И теперь у нас есть внешний рычаг. Теперь нам останется в нужном месте выполнить функцию в «r
«.
Для имитации асинхронности мы делаем вызов «r
» при помощи setTimeout()
. Через 3 секунды мы увидим в консоли браузера (или логах сервера NodeJS) сообщение `Все обещания выполнены`. Метод конструктора all()
подхватит разрешение Обещания.
На лето 2023 года ECMAScript ещё не создал метода разрешения Обещания для экземпляров класса Promise. Приходится городить собственные конструкции.
Информационные ссылки
Стандарт ECMAScript — Раздел «27.2 Promise Objects» — https://tc39.es/ecma262/#sec-promise-objects