setTimeout 延迟执行

clearTimeout 取消定时器(删除定时器)

setinterval  间隔执行

本模块提供基础的定时器能力,支持按照指定的时间执行对应函数。

说明

本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

开发者在UI界面中使用定时器时,定时器的触发机制会受UI底层原理管控,如果UI界面退到后台,定时器会被冻结。

setTimeout

setTimeout(handler: Function | string, delay?: number, ...arguments: any[]): number

设置一个定时器,该定时器在定时器到期后执行一个函数。

该定时器在回调被执行后自动删除,或使用clearTimeout接口手动删除。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

返回值:

代码演示:

@Entry
@Component
struct SetTimeoutPage {
 timeId?:number
  build() {
    Column({ space: 20 }) {
      Text('延时器-Timeout')
        .fontSize(30)
        .width('100%')
        .textAlign(TextAlign.Center)
      Row({ space: 20 }) {
        Button('开启延时器')
          .onClick(() => {
            // 开启延时器
            let timeId = setTimeout(() => {
              // 延迟执行逻辑
              console.log('代码执行啦')
            }, 2000)
            // 保存定时器 id
            this.timeId = timeId
          })
        Button('关闭延时器')
          .onClick(() => {
            // 调用 clearTimeout 清除定时器
            clearTimeout(this.timeId)
          })
      }

    }
    .padding(10)
  }
}

clearTimeout

clearTimeout(timeoutID?: number): void

可取消通过调用setTimeout()建立的定时器。

定时器对象保存在创建它的线程内,删除定时器需要在创建该定时器的线程删除。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

setInterval

setInterval(handler: Function | string, delay: number, ...arguments: any[]): number

重复调用一个函数,在每次调用之间具有固定的时间延迟。

删除该定时器需手动调用clearInterval接口。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

返回值:

代码演示:

@Entry
@Component
struct ShiYanPage {
  @State number:number=1
  timeId?:number
  build() {
    Column({ space: 20 }) {
      Text('定时器-Interval')
        .fontSize(30)
        .width('100%')
        .textAlign(TextAlign.Center)
      Row({ space: 20 }) {
        Button('开启延时器')
          .onClick(() => {
            let timeId = setInterval(() => {

              console.log(`代码执行${this.number}次啦!`)
              this.number+=1
            }, 1000)
            this.timeId = timeId
          })
        Button('关闭延时器')
          .onClick(() => {
            clearInterval(this.timeId)
          })
      }
    }
    .padding(10)
  }
}

clearInterval

clearInterval(intervalID?: number): void

可取消通过setInterval()设置的重复定时任务。

定时器对象保存在创建它的线程内,删除定时器需要在创建该定时器的线程删除。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

代码演示:

let intervalID = setInterval(() => {
  console.log('do every 1s.');
}, 1000);
clearInterval(intervalID);

其他说明

超时延迟

如果页面正忙于其他任务,超时也可能比预期的晚。setTimeout的函数或代码片段是在下一个时间周期执行的。例如:

function foo() {
  console.info('OH test foo is called')
}

setTimeout(foo, 0);
console.info('After OH test setTimeout')

// output
After OH test setTimeout
OH test foo is called

        这是因为,虽然setTimeout设置了0ms的延迟,但任务不是立即执行,而是会被放入队列中,等待下一次事件循环执行。当前正在执行的代码必须先完成,队列中的函数才会被执行,因此最终的执行顺序可能和预期不一致。

最大延迟值

        timer内部以32位带符号整数存储延时,这就会导致如果一个延时大于2147483647毫秒(大约24.8天)时就会溢出,导致定时器将会被立即执行。

定时器冻结

        定时器的触发受底层任务调度。当前应用被切换到后台后,定时器到期也不会触发。应用被重新拉起到前台后,到期定时器会按序触发。可使用trace查看进程是否还存在调度,如果没有调度,则定时器被冻结。

定时器ID

        setTimeout()和setInterval()使用共享的ID池,意味着在技术上可以混用clearTimeout()和clearInterval()。但出于代码清晰性考虑,我们应该避免混用它们。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐