iamqz 发表于 2022-12-21 15:16:43

怎么在命令之间进行延迟/delay/sleep?

比如我希望这样
```
(function() {
    'use strict';
   
    // Your code here...
    cmd_a()
    sleep(1)
    cmd_b()
    sleep(1)
    cmd_c()      
})();
```

iamqz 发表于 2022-12-21 15:30:09

本帖最后由 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:52:01

本帖最后由 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()
   

})();
```

李恒道 发表于 2022-12-21 15:16:44

最好用他前边提的
你发的这个代码会严重阻塞网页
弊端太重了一般情况下

王一之 发表于 2022-12-21 15:48:20

iamqz 发表于 2022-12-21 15:30
JavaScript 中实现 sleep - 刘哇勇 - 博客园
https://www.cnblogs.com/Wayou/p/javascript_sleep.html
在这 ...
这个就算了,可以用await/async setTimeout去实现

极品小猫 发表于 2022-12-21 16:32:14

如果a、b、c存在因果关系,建议直接快进学习promise……虽然难度很高

Ne-21 发表于 2022-12-21 16:37:01

用promise吧

王一之 发表于 2022-12-21 16:57:38

极品小猫 发表于 2022-12-21 16:32
如果a、b、c存在因果关系,建议直接快进学习promise……虽然难度很高

{:4_86:}我觉得很容易

极品小猫 发表于 2022-12-22 12:16:04

王一之 发表于 2022-12-21 16:57
我觉得很容易

如果promise里没有ajax之类的异步操作,是挺容易

iamqz 发表于 2022-12-22 14:06:38

李恒道 发表于 2022-12-21 15:16
最好用他前边提的
你发的这个代码会严重阻塞网页
弊端太重了一般情况下


确实是! 已经改用异步了!感谢!
页: [1] 2
查看完整版本: 怎么在命令之间进行延迟/delay/sleep?