您现在的位置是:首页 > 数码 > 

JS 通过 Promise 实现延时执行,支持链式调用

2025-07-23 17:16:12
JS 通过 Promise 实现延时执行,支持链式调用 JS 通过 Promise 实现延时执行,支持链式调用延时执行sleep 版本一同步执行异步方式sleep 版本二支持链式调用版本一版本二参考资料 延时执行 定义sleep函数 sleep 版本一 /*** 定义延时函数* delaytime 延时时长,单位毫秒*/ var sleep =

JS 通过 Promise 实现延时执行,支持链式调用

JS 通过 Promise 实现延时执行,支持链式调用
  • 延时执行
    • sleep 版本一
      • 同步执行
      • 异步方式
    • sleep 版本二
  • 支持链式调用
    • 版本一
    • 版本二
  • 参考资料

延时执行

定义sleep函数

sleep 版本一

/*** 定义延时函数* delaytime 延时时长,单位毫秒*/
var sleep = (delaytime = 1000) => {return new Promise(resolve => setTimeout(resolve, delaytime))
}
同步执行
(async () => {await sleep(000);cole.log(());
})();
/*** 定义延时函数* delaytime 延时时长,单位毫秒。默认1000*/
var sleep = (delaytime = 1000) => {return new Promise(resolve => setTimeout(resolve, delaytime))
}
/*** 遍历数据,调用 foo 逐个处理。* arr         待遍历的数组* callback    处理数组元素的业务逻辑。默认输出日志* delaytime   延时时长*/
async function delayDo(arr, callback = data=>cole.log(`数据:${data}`), delaytime) {var len = arr.length;for (let i = 0; i <len  ; i) {        await sleep(delaytime);callback(arr[i]);}
};
// 遍历数组,间隔 1 秒处理一个元素。
function main(){var arr = [1,2,,	呵呵哒!	,5,6,7,8,9];delayDo(arr);
}
main();
异步方式
sleep(000).then(() => {  cole.log(());
});
var sleep = (delaytime) => {return new Promise(resolve => setTimeout(resolve, delaytime))
}
sleep(1000).then(() => {  cole.log(());sleep(1000).then(() => {  cole.log(());sleep(1000).then(() => {  cole.log(());});});
});

sleep 版本二

/*** 睡眠。并每秒执行一次 callback,最终执行一次 final* * @param {number}    times    睡眠秒数(默认2)* @param {function}  callback 回调函数* @param {function}  final    扫尾方法(所有循环完成,最后执行一次它扫尾)*/
async function sleep(times = 2, callback = ()=>{}, final = ()=>{}) {for (let i = times; i > 0; i--) {callback(i);await new Promise(resolve => setTimeout(resolve, 1000));}final(times);
}

test

(async()=>{cole.log((new Date()).toLocaleString());await sleep(, i=>cole.log(`起床倒计时:${i}`), t=>cole.log(`睡了${t}秒,好饱啊。准备起床。`));cole.log((new Date()).toLocaleString());
})();
202//0 上午9:41:4
起床倒计时:
起床倒计时:2
起床倒计时:1
睡了秒,好饱啊。准备起床。
202//0 上午9:41:46

支持链式调用

版本一

今天需要按顺序执行一组方法,并支持结果向后传递。
照着别人的代码改了一下:

class Jdelay {ctructor() {this.params = []; // 用来缓存链式调用的结果进行传递this.queue = Promise.resolve();}/*** 睡眠指定时间。默认1秒*/sleep(time=1) {this.queue = this.(() => {return new Promise(res => {setTimeout(res, time * 1000)})})return this;}/*** 执行传入的方法*/do(callback) {this.queue = this.(() => {if(typeof callback == 	function	){// 将上一次执行结果作为参数传入。将本次执行结果保存备用。 this.params.push(callback(this.params.pop()));}else{cole.info(	请传入回调函数,当前是个:	, typeof callback);}})return this;}
}/*** 被调用的方法*/
function foo(data){var now = (new Date()).toLocaleString().match(/(\d)/g).map((d,i)=>d[	-	,	-	,	 	,	:	,	:	,		][i]).join(		);cole.info(now, 	前一个方法结果:	, data); return now  	某些事情发生了!	;
}// 链式调用次
new Jdelay().sleep().do(foo).sleep().do(foo).sleep().do(foo);

输出结果

2021-1-6 8:02:1 前一个方法结果: undefined
2021-1-6 8:02:4 前一个方法结果: 2021-1-6 8:02:1某些事情发生了!
2021-1-6 8:02:7 前一个方法结果: 2021-1-6 8:02:4某些事情发生了!

版本二

class JerryQueue {ctructor() {this.queue = [];}addSync(fn) {this.queue.push(param => Promise.resolve().then(()=>fn(param)));return this;}addAsync(fn) {this.queue.push(fn);return this;}sleep(times = 2, callback = i=>cole.log(`CD${i}...`), final = t=>cole.log(`睡眠${t}秒,结束!`)) {this.queue.push(async param => {for (let i = times; i > 0; i--) {callback(i);await new Promise(resolve => setTimeout(resolve, 1000));}final(times);return param;});return this;}async execute(param) {if(this.queue.length == 0)cole.log(`当前队列为空!`);let stack = param;for (ct fn of this.queue) {stack = await fn(stack);}return stack ;}
}
var executor = new JerryQueue();
var result = await executor.addSync(function(data){ cole.log(	1 同步操作	, data); return data1; })
.sleep()
.addAsync(async function(data){cole.log(	2 异步操作	, data); await fetch(		).then(cole.log);return data1;
})
.sleep()
.addSync(function(data){ cole.log(	 同步操作	, data); return data1; })
.sleep()
.execute(100); cole.log(	最终结果:	, result);

参考资料

用Promise实现:带延时功能的链式调用

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/805817.html

相关标签:无
上传时间: 2024-01-18 06:19:46
留言与评论(共有 16 条评论)
本站网友 机票同程
10分钟前 发表
4 起床倒计时: 起床倒计时:2 起床倒计时:1 睡了秒,好饱啊
本站网友 泰安杀人案
12分钟前 发表
callback = data=>cole.log(`数据:${data}`)
本站网友 渣打无抵押贷款
9分钟前 发表
1 前一个方法结果: undefined 2021-1-6 8
本站网友 出售二手房
16分钟前 发表
data); await fetch( ).then(cole.log);return data1; }) .sleep() .addSync(function(data){ cole.log( 同步操作
本站网友 三牛念什么
18分钟前 发表
7 前一个方法结果: 2021-1-6 8
本站网友 桦树茸的功效与作用
2分钟前 发表
data); return data1; }) .sleep() .execute(100); cole.log( 最终结果:
本站网友 绿豆薏仁汤
17分钟前 发表
result); 参考资料 用Promise实现:带延时功能的链式调用
本站网友 迅雷8
17分钟前 发表
4 起床倒计时: 起床倒计时:2 起床倒计时:1 睡了秒,好饱啊
本站网友 女人梦见好多蛇
19分钟前 发表
final = ()=>{}) {for (let i = times; i > 0; i--) {callback(i);await new Promise(resolve => setTimeout(resolve
本站网友 天鉴论坛
23分钟前 发表
准备起床
本站网友 matroska
27分钟前 发表
4 起床倒计时: 起床倒计时:2 起床倒计时:1 睡了秒,好饱啊
本站网友 小儿善存片
6分钟前 发表
callback = ()=>{}
本站网友 性健康网
4分钟前 发表
data); await fetch( ).then(cole.log);return data1; }) .sleep() .addSync(function(data){ cole.log( 同步操作
本站网友 人体改造师
9分钟前 发表
callback = data=>cole.log(`数据:${data}`)
本站网友 静脉曲张治疗
14分钟前 发表
将本次执行结果保存备用