怎么在命令之间进行延迟/delay/sleep?
比如我希望这样```
(function() {
'use strict';
// Your code here...
cmd_a()
sleep(1)
cmd_b()
sleep(1)
cmd_c()
})();
```
本帖最后由 iamqz 于 2022-12-22 14:08 编辑
JavaScript 中实现 sleep - 刘哇勇 - 博客园
https://www.cnblogs.com/Wayou/p/javascript_sleep.html
在这篇文章里发现一种方法:
function syncSleep(time) {
const start = new Date().getTime();
while (new Date().getTime() - start < time) {}
}上面这种是同步执行延迟,
经各位猴友的提醒和我的测试,发现这种方式会阻塞其他油猴脚本和网页加载, 而且它和html元素的.click()命令组合使用时,所有的click()都会在最后才执行,而不是立马执行, 因此不推荐.
于是改用下面的异步延迟, 推荐下面这种异步方式
function sleep1(time) {
time*=1000
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
});
}
然后在async 函数里使用 await sleep1(延迟秒数)进行调用
测试例子见 楼下 https://bbs.tampermonkey.net.cn/ ... ptid=3916&pid=48370
感谢各位猴友~ 完结撒花~
本帖最后由 iamqz 于 2022-12-22 13:57 编辑
异步延迟 测试例子:
多次间隔地点击baidu.com首页右侧百度热搜的换一换按钮
```
// ==UserScript==
// @name 测试油猴4
// @namespace http://tampermonkey.net/
// @version 0.1
// @descriptiontry to take over the world!
// @author You
// @match *://*/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=baidu.com
// @grant none
// ==/UserScript==
function log(msg){
console.log(msg)
}
function sleep1(time) {
time*=1000
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
});
}
// 油猴主函数,加上async 改成异步函数; 在内部使用await sleep()来调用异步延迟
(async function() {
'use strict';
// Your code here...
log(`异步测试油猴1`)
await sleep1(3)
document.querySelector("a.c-font-normal.c-color-gray2.hot-refresh").click()
log(`异步测试油猴2`)
await sleep1(3)
document.querySelector("a.c-font-normal.c-color-gray2.hot-refresh").click()
})();
``` 最好用他前边提的
你发的这个代码会严重阻塞网页
弊端太重了一般情况下
iamqz 发表于 2022-12-21 15:30
JavaScript 中实现 sleep - 刘哇勇 - 博客园
https://www.cnblogs.com/Wayou/p/javascript_sleep.html
在这 ...
这个就算了,可以用await/async setTimeout去实现 如果a、b、c存在因果关系,建议直接快进学习promise……虽然难度很高 用promise吧 极品小猫 发表于 2022-12-21 16:32
如果a、b、c存在因果关系,建议直接快进学习promise……虽然难度很高
{:4_86:}我觉得很容易 王一之 发表于 2022-12-21 16:57
我觉得很容易
如果promise里没有ajax之类的异步操作,是挺容易 李恒道 发表于 2022-12-21 15:16
最好用他前边提的
你发的这个代码会严重阻塞网页
弊端太重了一般情况下
确实是! 已经改用异步了!感谢!
页:
[1]
2