Условие протокола неверно. Вы должны использовать:
extension Camera where Self: UIViewController {
Я не знаю, каков эффект от производительности многих вызовов setTimeout, но я бы предпочел установить timeAgo
как объект даты, а затем проверять разницу между now
и этим объектом даты при каждом обновлении пользовательского интерфейса. :
export interface IQuestion {
createdAt: Date;
}
export class Question implements IQuestion {
public createdAt: Date;
constructor(question: IQuestion) {
this.createdAt = new Date();
}
getAge(): String {
return (new Date() - this.createdAt).toSomeStringAccordingToAge()
}
}
Я не знаю, правильный ли синтаксис, так как я не использую Typescript. Например, как говорится в одном из комментариев, упомянутых ниже, было бы лучше использовать метод доступа (getter
).
Хорошо, newQuestion
и первые setTimeout
- это всего лишь шаблонный код, чтобы заставить что-то работать для тестирования. Пожалуйста, игнорируйте. Второй setInteval - то, где мы смотрим на наш атрибут data
. Этот атрибут соответствует стандарту HTML. и могут быть доступны через [HTMLElement].dataset
. Мы проверяем время нашей публикации против текущей. В одном методе.
const newQuestion = () => {
let target = document.querySelector('.questions');
let question = document.createElement('div');
question.className = 'question';
question.setAttribute('data-question-date', Date.now());
question.innerHTML = '<span>Test Question - <span><span class="age">Just Now</span>';
target.appendChild(question);
};
document.addEventListener('DOMContentLoaded', () => {
setInterval(() => {
newQuestion();
}, 5000);
setInterval(() => {
let questions = document.querySelectorAll('.question');
questions.forEach(q => {
let dateofQ = q.dataset.questionDate;
let age = Math.floor((Date.now() - dateofQ)/1000);
console.log(`age: ${age}`);
let ageElement = q.querySelector('.age');
//do just 20 secs, so we don't have to wait.
if(age < 20) {
ageElement.innerHTML = 'Just now';
} else if (age < 300) {
ageElement.innerHTML = 'Less than 5 minutes ago.';
} else {
ageElement.innerHTML = 'More than 5 minutes ago.';
}
});
}, 1000);
});
<div class="questions">
</div>