我如何 运行 循环中的代码直到执行点击?

How do I run the code in a loop until a click has been performed?

我正在尝试在我的国家预订疫苗。此代码应用过滤器,然后在有疫苗可用时单击插槽。

前 3 行 select 过滤器和最后一行点击可用广告位。

document.querySelector('.pin-search-btn.district-search.md.button.button-solid.ion-activatable.ion-focusable.hydrated').click()
setTimeout(() => {
  document.querySelector('#c1').click()
}, 1000);
setTimeout(() => {
  document.querySelector('#c5').click()
  document.querySelectorAll('.vaccine-box').forEach(function(item) {
    if (item.getElementsByTagName('a')[0].innerHTML !== ' Booked ' && item.getElementsByTagName('a')[0].innerHTML !== ' NA ') {
      item.getElementsByTagName('a')[0].click()
    }
  })
}, 2000);
<-- html needed -->

我想 运行 这段代码在 2 秒的时间间隔内循环,直到执行最后一次点击。 item.getElementsByTagName('a')[0].click()

P.S:我在 Chrome 上的开发人员工具中 运行 宁此,我不知道该信息是否与此处相关。

凭直觉,我建议保留一个布尔值 hasClickedSlot = false,您会在单击插槽后更新它。在再调用 setTimeout 2 秒之前,请确保 !hasClickedSlot 仍然有效。

可能看起来像:

let hasClickedSlot = false;

function clickButton() {
  document.querySelector('.pin-search-btn.district-search.md.button.button-solid.ion-activatable.ion-focusable.hydrated').click();
  
  // after 1 second, click on the C1 button
  setTimeout(clickC1, 1000);
}

function clickC1() {
  document.querySelector('#c1').click();
  
  // after 2 seconds, try to click on a slot
  setTimeout(tryClickSlot, 2000);
}


function tryClickSlot() {
  document.querySelector('#c5').click();
  document.querySelectorAll('.vaccine-box').forEach(function(item) {
    if (item.getElementsByTagName('a')[0].innerHTML !== ' Booked ' && item.getElementsByTagName('a')[0].innerHTML !== ' NA ') {
      item.getElementsByTagName('a')[0].click()
      hasClickedSlot = true;
    }
  });

  // if no slot was clicked yet, do it again
  if (!hasClickedSlot) {
    clickButton();
  }
}

// start the process
clickButton();

此代码的缺点特别是构建了调用堆栈,因为函数不会return而是保持堆栈。

编辑:由于函数 return 在调用 setTimeout 之后没有构建堆栈调用(例如在递归期间)。