Обещания не могут быть разрешены вне их пределов без предварительного сохранения некоторых ссылок.Если вы хотите решить их извне массива, вы должны также вставить соответствующие разрешения и отклонить обратные вызовы в объект, чтобы их можно было использовать вне этой области.Пример:
let myRefHolder = {};
let toResolve = new Promise((res, rej) => {
myRefHolder.resolutionCallback = res;
//other code
});
И затем в четном обработчике:
clickHandler = () => {
myRefHolder.resolutionCallback(resolutionValue);
//other code
}
Тогда вам просто нужно немного изменить эту структуру, чтобы учесть все ваши обещания и обратные вызовы ... ВместоmyRefHolder
объект, вы можете иметь массив объектов в форме myRefHolders
, один раз для каждого Обещания!
Альтернативой является назначение обработчика события кнопки непосредственно в Обещании:
new Promise((rej, res) => yourButtonElement.addEventListener(‘click’, res));
Это будет решено, когда вы нажмете на кнопку.Вместо ref вы также можете передать более сложную встроенную функцию, которая имеет более сложную логику.Поскольку у события может быть несколько обработчиков, вы можете продолжать добавлять к этому событию каждое ваше обещание - но оно может стать грязным, потому что вам придется удалить прослушиватель перед фактическим разрешением обещания (пример кода строки 1, который я использовал, скорее всего, будетутечка памяти из-за того, что этот обработчик остается живым и не позволяет сборщику мусора освободить память Promise)
Если вы спрашиваете, как мне затем / поймать конкретное обещание в массиве обещаний, это какпросто, как myArray[index].then(() => {})
Если вы ожидаете массив обещаний, просто, как Promise.all(myArray)