Nodejs定时器Promise封装模块timers/promises的使用

Nodejs定时器Promise封装模块timers/promises的使用
timers/promises 模块是 Node.js 提供的一个用于处理定时器的 Promise 化版本。它允许你以更现代的方式处理异步操作,而不需要回调地狱。这个模块提供了 setTimeout, setInterval, setImmediateclearTimeout, clearInterval, clearImmediate 的 Promise 化版本。

安装

由于 timers/promises 是 Node.js 内置模块,所以不需要安装,直接导入即可:

const { setTimeout } = require('timers/promises');

使用示例

1. setTimeout

setTimeout 函数返回一个在指定时间后解决的 Promise。

(async () => {
    console.log('Start');
    await setTimeout(2000); // 等待2秒
    console.log('2 seconds have passed');
})();

2. setInterval

setInterval 返回一个每隔一定时间重复执行的 Promise。你可以使用 .then 或者 async/await 来处理。

(async () => {
    let count = 0;
    const intervalId = setInterval(async () => {
        console.log(`Count: ${count}`);
        count++;
        if (count >= 5) {
            clearInterval(intervalId);
        }
    }, 1000); // 每隔1秒执行一次
})();

3. setImmediate

setImmediate 返回一个在当前事件循环结束时执行的 Promise。

(async () => {
    console.log('Start');
    await setImmediate();
    console.log('Immediate execution');
})();

4. 清除定时器

清除定时器的函数(如 clearTimeout, clearInterval)可以接受定时器 ID 并取消相应的定时器。

(async () => {
    console.log('Start');

    const timerId = setTimeout(() => {
        console.log('This should not be logged');
    }, 5000);

    setTimeout(() => {
        clearTimeout(timerId);
        console.log('Timer cleared');
    }, 1000);
})();

总结

使用 timers/promises 模块可以让你的代码更加清晰和易于管理,特别是当你需要处理多个异步操作时。通过将传统的回调式定时器转换为基于 Promise 的方式,你可以更容易地使用 async/await 来编写异步代码,从而避免回调地狱的问题。


3 回复

当然,了解timers/promises模块可以让Node.js中的定时器操作更符合现代JavaScript的编程风格。这个模块提供了基于Promise的setTimeoutsetInterval方法,让异步代码更加优雅。

首先,你需要引入这个模块:

const { setTimeout: setTimeoutPromise, setInterval: setIntervalPromise } = require('timers/promises');

然后你可以这样使用它:

  1. setTimeoutPromise:等待一段时间后执行某些操作。

    async function waitAndLog() {
      await setTimeoutPromise(2000); // 等待2秒
      console.log("时间到!");
    }
    
  2. setIntervalPromise:周期性地执行某些操作。

    async function periodicLog() {
      const intervalId = setIntervalPromise(1000, () => console.log("滴答!")); // 每秒打印一次
      // 为了演示,我们只让它运行5秒
      await setTimeoutPromise(5000);
      clearInterval(intervalId);
    }
    

这样,你就能够以更现代化的方式处理定时任务了,是不是感觉代码变得更加简洁易懂了呢?


在Node.js中,timers/promises模块提供了基于Promise的定时器API,这使得异步操作更易于处理。下面是这个模块的一些基本用法示例。

安装Node.js

首先确保你的环境中安装了Node.js。可以通过运行node -v来检查Node.js版本。

引入模块

const { setTimeoutPromise, setIntervalPromise, clearTimeout, clearInterval } = require('timers/promises');

使用setTimeoutPromise

setTimeoutPromise函数可以用来创建一个基于Promise的延迟执行。

(async () => {
  console.log('开始');
  
  // 延迟2秒后执行
  await setTimeoutPromise(2000);
  
  console.log('结束');
})();

这段代码会先输出"开始",然后等待2秒,最后输出"结束"。

使用setIntervalPromise

setIntervalPromise函数可以用于创建一个基于Promise的周期性任务。

(async () => {
  let count = 0;
  const intervalId = setIntervalPromise(async (resolve) => {
    console.log(`计数: ${count}`);
    
    count++;
    
    if (count === 5) {
      clearInterval(intervalId); // 当计数达到5时停止
    }
    
    resolve();
  }, 1000); // 每秒执行一次
})();

这段代码会每秒打印一次计数值,并且当计数达到5时停止循环。

清除定时器

为了防止内存泄漏或不必要的计算,通常需要在不需要时清除定时器。可以使用clearTimeoutclearInterval来清除setTimeoutPromisesetIntervalPromise创建的定时器。

(async () => {
  const timeoutId = setTimeoutPromise(3000);
  
  // 两秒后清除定时器
  setTimeout(() => {
    clearTimeout(timeoutId);
  }, 2000);
})();

这段代码会在3秒后打印信息,但在2秒后被手动清除,因此不会执行。

以上就是timers/promises模块的基本使用方法。

timers/promises 是 Node.js 中用于处理定时器的 Promise 封装模块。你可以使用 setTimeoutsetInterval 的 Promise 版本以避免回调地狱。

例如,使用 setTimeoutP 可以这样写:

const { setTimeout: setTimeoutP } = require('timers/promises');

async function wait(ms) {
    await setTimeoutP(ms);
    console.log('时间到了!');
}

wait(2000);  // 两秒后输出“时间到了!”

这样可以更方便地在异步函数中使用定时器。

回到顶部