Я хочу создать объект, который предоставляет следующий интерфейс:
// Create the object that counts to three
const c = counter(3);
// c.finished is a promise that resolves when c.count() is invoked three times
c.finished.then(() => console.log('counted three times!'));
// Somewhere else, c.count() is invoked in async body
setTimeout(() => c.count(), 500);
setTimeout(() => c.count(), 1000);
setTimeout(() => c.count(), 1500);
Я ожидаю, что c.finished
разрешится через 1,5 секунды.
Как написать counter(countTimes)
, используя тольконативный Promise
API?
Раскрытие информации У меня уже есть решение для вышеуказанной проблемы, я хочу знать, каков самый элегантный способ сделать это.
Редактировать
Мое оригинальное решение было:
class AsyncCounter {
constructor(countTimes) {
let currentCount = 0;
this.countTimes = countTimes;
this.ready = new Promise(resolveReady => {
this.finished = new Promise(resolveFinished => {
const count = () => {
currentCount++;
if (currentCount >= this.countTimes) {
resolveFinished();
}
return currentCount;
};
this.count = () => this.ready.then(() => count());
resolveReady();
});
});
}
}
const counter = countTimes => new AsyncCounter(countTimes);
Как предложено @Bergi и согласно Документы MDN для функции исполнителя :
исполнитель вызывается до того, как конструктор Promise даже возвращает созданный объект
Следовательно, обещание ready
в приведенном выше решении не является необходимым.