一、之前的链接仍然好用。
二、继续学习新的教程
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);');