Я не уверен, поможет ли это, но; Любую функцию можно превратить в обещание, и в этом случае вам может пригодиться альтернативный синтаксис [ключевое слово async].
async function test() {
return "hello";
}
test().then( returned => console.log(returned)) // logs hello
setInterval (), однако, не возвращает возвращаемого значения, а возвращает «дескриптор».
ручка = окно. setInterval (обработчик [, timeout [, arguments]])
...
https://www.w3.org/TR/2011/WD-html5-author-20110705/spec.html#timers
Однако вы можете давать обещания из setinterval ...
interval = window.setInterval(makepromise,1000)
async function makepromise() {
console.log("hello");
}
// или
interval = window.setInterval(async function () {console.log("hello");},1000)
Но тогда нет места для. Мы вернулись к обратным вызовам, которых мы пытались избежать! Но, возможно, есть функциональность, которую мы можем использовать await в этой функции.
Лучше сделать ваш calcTime оставшимся к обещанию, а затем вы можете использовать затем на интервале.
interval = window.setInterval(gameloop,1000);
function gameloop(endDate: string) {
calculateTimeRemaining(endDate: string).then(
//
// my then code goes here.
//
)
}
async calculateTimeRemaining(endDate: string) {
const { secondsInDay, daysOfYear, secondsInHour, secondsInMinute } = this.unitsOfTime;
let distance: number =
(Date.parse(new Date(endDate).toString()) - Date.parse(new Date().toString())) / this.increment;
if (distance > 0) {
// Years left
if (distance >= daysOfYear * secondsInDay) {
// 365.25 * 24 * 60 * 60
this.timeRemaining.years = Math.floor(distance / (daysOfYear * secondsInDay));
distance -= this.timeRemaining.years * daysOfYear * secondsInDay;
}
// Days left
if (distance >= secondsInDay) {
// 24 * 60 * 60
this.timeRemaining.days = Math.floor(distance / secondsInDay);
distance -= this.timeRemaining.days * secondsInDay;
}
// Hours left
if (distance >= secondsInHour) {
// 60 * 60
this.timeRemaining.hours = Math.floor(distance / secondsInHour);
distance -= this.timeRemaining.hours * secondsInHour;
}
// Minutes left
if (distance >= secondsInMinute) {
// 60
this.timeRemaining.minutes = Math.floor(distance / secondsInMinute);
distance -= this.timeRemaining.minutes * secondsInMinute;
}
// Seconds left
this.timeRemaining.seconds = distance;
}
return this.timeRemaining;
}
Однако значение обещаний состоит в том, чтобы избежать ада обратного вызова с чрезмерно сложной схемой обратного вызова ... когда код выполняет обратный вызов, от обратных вызовов, от обратных вызовов и т. Д., И т. Д. И т. Д.
Обещания не работают во втором потоке операционной системы, как веб-работник. Поэтому, если вы не пытаетесь очистить обратные вызовы, чтобы сделать код читабельным, или на самом деле ждете чего-то, бесполезно использовать обещания.
setInterval - это чистый обратный вызов. Пример Gameloop не легче прочитать и понять, потому что было использовано обещание. Я бы предположил, что в этом случае его сложнее читать. на этом этапе ... если в цикле нет других ожидающих или серии обещаний, которые не должны выполняться синхронно;