这两个函数 sleep
和 delay
都是使用 JavaScript 的 Promise 和 setTimeout
来实现异步操作的。不过它们的功能略有不同,下面我为你详细解释:
sleep
函数
sleep
函数接受一个秒数 seconds
,并返回一个 Promise,该 Promise 在指定的秒数后解析。它主要用于在异步操作中模拟等待或延迟。
const sleep = (seconds) => new Promise(resolve => setTimeout(resolve, seconds));
// 使用示例
async function demo() {
console.log('开始');
await sleep(2); // 等待2秒
console.log('2秒后');
}
demo();
delay
函数
delay
函数接受一个函数 func
、一个秒数 seconds
和一些额外的参数 ...args
。这个函数返回一个 Promise,该 Promise 在指定的秒数后调用传入的函数 func
并将其结果作为 Promise 的解析值。如果 func
函数抛出异常,那么 delay
返回的 Promise 会被拒绝。
function delay (func, seconds, ...args) {
return new Promise((resolve, reject) => {
setTimeout(() => {
Promise.resolve(func(...args)).then(resolve, reject); // 注意这里也处理了reject
}, seconds);
});
}
// 使用示例
function greet(name) {
return `Hello, ${name}!`;
}
delay(greet, 2000, 'World').then(result => console.log(result)); // 等待2秒后输出 "Hello, World!"
注意事项
- 在
delay
函数中,Promise.resolve(func(...args))
是为了确保即使func
不是一个返回 Promise 的函数,我们也能以统一的方式处理其返回值或抛出的异常。 - 如果
func
是一个返回 Promise 的函数,那么delay
也会等待这个 Promise 解析或拒绝后再继续。 - 在
delay
的实现中,我们同时处理了resolve
和reject
的情况,以确保即使func
抛出异常,delay
返回的 Promise 也能正确地拒绝。 delay
函数提供了更高级的功能,因为它允许你在延迟后执行任意函数并处理其结果或异常。而sleep
函数则更简单,只是简单地等待一段时间。