javascript - 如何在javascript中添加延迟

标签 javascript jquery

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/

相关文章:

javascript - 如何清除预先填充 $_POST 值的表单元素

javascript - 获取评估后的答案以在显示屏上阅读

javascript - Google Chrome 和 Firefox 的 jquery ajax html 问题

jquery - Contenteditable 显示最后插入的 html 元素

javascript - 在 JavaScript 中将 EST 时区日期转换为 'dd-mmm-yyyy' 格式

javascript - 在 Chrome 开发者工具中寻找特定的 javascript 变量值

javascript - YouTube API - 根据 API 抓取缩略图的鼠标悬停更改 H1 标签?

javascript - 使用beforeunload在页面退出前执行任务

javascript - 如何让页面点击下滑而不刷新

Jquery - 在li中选择img