龙空技术网

Delay.js:且看前端大神如何延迟 Promise ?

高级前端进阶 1297

前言:

现在同学们对“js延时5秒”大约比较关怀,我们都需要剖析一些“js延时5秒”的相关文章。那么小编同时在网摘上网罗了一些有关“js延时5秒””的相关文章,希望姐妹们能喜欢,姐妹们一起来学习一下吧!

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

1.什么是 Delay

由前端大神 sindresorhus 开发的 Delay 库用于将 Promise 延迟指定的时间。

当然,如果开发者仅针对 Node.js,则可以使用如下方式:

import {setTimeout} from 'node:timers/promises'; await setTimeout(1000);

如果需要浏览器支持该功能,可以使用这个包仍。

2.如何使用 Delay延迟指定时间

import delay from 'delay';bar();await delay(100);//  100ms后执行baz();
延迟后返回指定的值
import delay from 'delay';const result = await delay(100, {value: ''});// Executed after 100 millisecondsconsole.log(result);// 返回值 => ''
取消延迟

如果信号被中止,返回的 Promise 将被reject,并出现 AbortError。

import delay from 'delay';const abortController = new AbortController();setTimeout(() => {	abortController.abort();}, 500);try {	await delay(1000, {signal: abortController.signal});} catch (error) {	// 500 milliseconds later	console.log(error.name)	//=> 输出 'AbortError'}
清除延迟并resolve Promise

如果传递一个已经 resolve 的 Promise 或来自其他地方的Promise,它不会执行任何操作。

import delay, {clearDelay} from 'delay';const delayedPromise = delay(1000, {value: 'Done'});setTimeout(() => {	clearDelay(delayedPromise);}, 500);// 500 milliseconds laterconsole.log(await delayedPromise);//=> 输出 'Done'
使用createDelay({clearTimeout, setTimeout})

使用提供的函数创建一个新的delay实例来清除和设置超时。如果要在全局范围内存根计时器,但仍然想使用delay来管理测试,那么这很有用。

import {createDelay} from 'delay';const customDelay = createDelay({clearTimeout, setTimeout});const result = await customDelay(100, {value: ''});// Executed after 100 millisecondsconsole.log(result);// 输出 => ''
3.Delay源码

接下来一起看看delay延迟的源码实现,具体代码逻辑可以参考注释。

// From  randomInteger = (minimum, maximum) => Math.floor((Math.random() * (maximum - minimum + 1)) + minimum);const createAbortError = () => {	const error = new Error('Delay aborted');	error.name = 'AbortError';	return error;};const clearMethods = new WeakMap();export function createDelay({clearTimeout: defaultClear, setTimeout: defaultSet} = {}) {	// 不能在这里使用“async”,因为我们需要 Promise 身份。	return (milliseconds, {value, signal} = {}) => {		// TODO: Use `signal?.throwIfAborted()` when targeting Node.js 18.		if (signal?.aborted) {			return Promise.reject(createAbortError());		}    // 如何signal被取消,则直接reject		let timeoutId;		let settle;		let rejectFunction;		const clear = defaultClear ?? clearTimeout;		const signalListener = () => {			clear(timeoutId);			rejectFunction(createAbortError());		};		const cleanup = () => {      // 移除事件			if (signal) {				signal.removeEventListener('abort', signalListener);			}		};		const delayPromise = new Promise((resolve, reject) => {			settle = () => {				cleanup();				resolve(value);			};			rejectFunction = reject;			timeoutId = (defaultSet ?? setTimeout)(settle, milliseconds);		});    // 监听abort事件		if (signal) {			signal.addEventListener('abort', signalListener, {once: true});		}    // 延迟promise		clearMethods.set(delayPromise, () => {			clear(timeoutId);			timeoutId = null;			settle();		});		return delayPromise;	};}const delay = createDelay();export default delay;// 导出delayexport async function rangeDelay(minimum, maximum, options = {}) {	return delay(randomInteger(minimum, maximum), options);}export function clearDelay(promise) {	clearMethods.get(promise)?.();}

下面是与Delay类似的相关库:

delay-cli :此模块的 CLIp-cancelable : 创建一个可以取消的 Promisep-min-delay : 将 Promise 延迟最短时间p-immediate:Promise 返回下一个事件循环中 resolve的 Promise ,类似 setImmediatep-timeout :在指定时间后超时 Promise参考资料

标签: #js延时5秒 #c语言延时函数delay怎么写 #c语言延时函数delay延时1秒