如何在javascript中插入简单的延迟

问题描述 投票:0回答:1

所以我想做一些网页抓取,使用 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 循环的下一个迭代。关于如何做到这一点有什么想法吗?我愿意重组代码以使其按预期工作

javascript web-scraping async-await applescript async.js
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.