所以我想做一些网页抓取,使用 AppleScript 在网页上运行 javascript 代码。我有以下代码:(编辑以删除专有数据)
function inputPunch(date_string) {
// do task 1
wait(3000);
// do task 2
wait(3000);
// do task 3
wait(3000);
// do final task
}
// get start date value
var date_obj = new Date(start_date_value);
date_obj.setDate(date_obj.getDate() + 2);
for(let i = 0; i < 12; i++) {
let cur_date_string = date_obj.toDateString();
let cur_date_array = cur_date_string.split(" ");
cur_date_array[2] = cur_date_array[2].replace(/^0+(\\d)|(\\d)0+$/gm, '$1$2');
let cur_formatted_date_string = cur_date_array[1].concat(" ", cur_date_array[2], ",", cur_date_array[3]);
console.log(cur_formatted_date_string);
// call inputPunch at each iteration of the for loop
inputPunch(cur_formatted_date_string);
date_obj.setDate(date_obj.getDate() + 1);
}
任务是 javascript UI 任务,等待是必要的。当我运行此代码时,它说等待未定义,并且脚本不执行任何操作。我也用过
await new Promise(resolve => setTimeout(resolve, ms));
,我从如何在javascript中设置时间延迟得到的,但后来我得到了“new”是意外的错误。我会使用设置超时并将任务转换为它们自己的函数,但问题是我需要初始 inputPunch 也等待,并且在第一个迭代完成之前不会进入 for 循环的下一个迭代。关于如何做到这一点有什么想法吗?我愿意重组代码以使其按预期工作
JS 中没有睡眠函数,但很容易创建自己的睡眠函数。所以你的代码将如下所示:
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
async function inputPunch(date_string) {
// do task 1
await sleep(3000)
// do task 2
await sleep(3000)
// do task 3
await sleep(3000)
// do final task
}
// get start date value
var date_obj = new Date(start_date_value)
date_obj.setDate(date_obj.getDate() + 2)
// Put this in function so you can use async/await
async function bootstrap() {
for (let i = 0; i < 12; i++) {
let cur_date_string = date_obj.toDateString()
let cur_date_array = cur_date_string.split(' ')
cur_date_array[2] = cur_date_array[2].replace(
/^0+(\\d)|(\\d)0+$/gm,
'$1$2'
)
let cur_formatted_date_string = cur_date_array[1].concat(
' ',
cur_date_array[2],
',',
cur_date_array[3]
)
console.log(cur_formatted_date_string)
// call inputPunch at each iteration of the for loop
await inputPunch(cur_formatted_date_string)
date_obj.setDate(date_obj.getDate() + 1)
}
}
bootstrap()