js循环中的暂停:可用于for循环中

一、之前的链接仍然好用

二、继续学习新的教程

1、使用async 将异步方法变为同步方法执行,只有返回 resolve才会触发 await向下执行。可以实现for循环的暂停

const sleep = (timeout= 1000)=>new Promise((resolve, reject)=>{
    setTimeout(resolve, timeout);
});
// 可以使用 bluebird模块中的 bluebird.delay() 替换 sleep()
// const bluebird = ruquire('bluebird');
let timer = async(timeout) => {
    for(let i = 0; i< timeout; i++) {
        await sleep(1000);
        console.log(i+1);
    }
}
timer(10);

2、变体

const sleep = (timeout= 1000)=>new Promise((resolve, reject)=>{
    setTimeout(resolve, timeout);
});
var cate1s=document.getElementsByClassName('cate')
let timer_click = async(time) => {
    for(let i=0; i<cate1s.length; i++){
        cate1s[i].click()
        await sleep(time)
    }
}
timer_click(1000)

3、实际应用,需要自动将10个页面中每个子页面作业名称统计出来。

/*
 *变量内容复制到剪切板copyContent
 *调用 copyContent(content)
 */
function copyContent(content) {
   /*使用textarea支持换行,使用input不支持换行*/
   const textarea = document.createElement('textarea');
   textarea.value = content;
   document.body.appendChild(textarea);
   textarea.select();
   if (document.execCommand('copy')) {
       document.execCommand('copy');
   }
   document.body.removeChild(textarea);
}
/*
 *休眠函数sleep
 *调用 await sleep(1500)
 */
const sleep = (timeout = 1000) => new Promise((resolve, reject)=>{
    setTimeout(resolve, timeout);
});
var work = async(time) => { /*【注意1】这是使用同步*/
   var page = document.querySelector("ng-star-inserted");/*下一页*/
   var num = document.querySelector("ctive > a").innerText;/*总页面数量*/
   num += 0; /*格式化为数字*/
   for (var j=0; j<num; j++){
       var obj = document.querySelector("div:nth");/*目标区域*/
       var res = '';/*临时变量*/
       for (var i=1; i<=obj.childElementCount; i++){
           var str = obj.childNodes[i].innerText;
           str = str.replace(/\n/g, ", "); /*同一个体将换行替换为逗号*/
           res += str + '\n'; /*不同个体之间加上换行以示区别*/
       }
       result += res; /*赋值给全局变量*/
       await sleep(1000); /*【注意2】前面加上await*/
       page.click(); /*点击下一页*/
       await sleep(3000); /*【注意2】前面加上await*/
   }
}
var result = ''; /*全局变量*/
work(); /*间隔时间在这里设置 work(2000),因为内部已设置了时间,这里不去统一设置*/
console.log('上述运行结束后,请手动运行一下\ncopyContent(result);');