function abc(elm){
this.$elm = document.querySelector(elm)
}
abc.prototype.addClass = function (str){
this.$elm.classList.add(str)
return this
}
abc.prototype.removeClass = function (str){
this.$elm.classList.remove(str)
return this
}
abc.prototype.delay = function (timer){
let self = this
setTimeout(()=>{
return self
},timer)
return this
}
function $(str){
return new abc(str);
}
let x = $('#test').delay(5000).delay(1000).addClass('red');
console.log($('#test'));
我想在 6
秒后添加 red
类。我试过像使用 setTimeout 但不起作用。你能建议更好的方法吗?
我想写一个延迟函数,在继续/执行下一个代码之前延迟一段时间。
最佳答案
您可以根据 promise 创建一个非常简单的待执行任务队列。由于 promise 执行已经使用了一个任务队列,因此您只需要保持一个 promise,并且每当您有新事物要添加时,您可以通过 .then()
将其链接起来并保持最新的 promise。这样,如果您添加三个任务 T1
-> T2
-> T3
,它们将按照添加的顺序解析。如果你添加一个任务,只是在它们之间添加一个简单的延迟,比如 T1
-> wait 6 seconds -> T2
-> wait 5 seconds -> T3
然后它将运行也间隔执行。
这是一个示例实现,用于说明利用 thunks 的想法(不带参数的函数)作为延迟和稍后执行的任务。
function abc(elm){
this.$elm = document.querySelector(elm)
this.queue = Promise.resolve();
}
/**
* Uniform way of adding a task for later execution
* @param {Function} task - a thunk to be executed later
* @param {number} [delay=0] time in milliseconds to wait after last task finished before executing this on
*/
abc.prototype.addTask = function(task, delay = 0) {
const waitFor = () => new Promise( res => setTimeout(res, delay) );
this.queue = this.queue
.then(waitFor)
.then(task)
}
abc.prototype.addClass = function (str){
this.addTask(() => this.$elm.classList.add(str));
return this
}
abc.prototype.removeClass = function (str){
this.addTask(() => this.$elm.classList.remove(str));
return this
}
abc.prototype.delay = function (timer){
// add an empty function as a task. If needed this can also do logging or other internal logic
this.addTask(() => {}, timer);
return this
}
function $(str){
return new abc(str);
}
//usage
let x = $('#test').delay(5000).delay(1000).addClass('red');
x.delay(1000)
.delay(1000)
.delay(1000)
.delay(1000)
.delay(1000) //5 seconds
.removeClass('red');
.red {
background-color: red;
color: white;
}
<p id="test">
Bacon ipsum dolor amet hamburger t-bone pork, pastrami sirloin swine corned beef tenderloin frankfurter tail ball tip meatball pork belly spare ribs prosciutto. Bresaola turkey buffalo jowl t-bone biltong burgdoggen cow capicola meatball pastrami boudin alcatra. Bresaola chicken bacon cow, frankfurter meatball hamburger jerky. Shankle capicola chicken leberkas turkey. Ball tip bacon doner kielbasa jerky. Salami picanha chicken bacon, turducken buffalo chislic andouille porchetta tongue shankle prosciutto t-bone. Beef andouille cow pork chop alcatra, turducken ribeye sirloin tail boudin strip steak doner.
</p>
关于javascript - 如何在javascript中添加延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63410472/