我目前有5个功能;每个人使用setInterval
等待加载元素,而不是点击元素可用时导致下一个网页。这些函数也发生在while
循环内。这些函数一个接一个地发生并且while
循环等待所有函数在再次循环之前完成是非常重要的。由于函数是异步的,因此在任何函数甚至可以加载之前,循环将运行x
次。
我想要做的例子:
function one () {
var checkForItem = setInterval(function () {
if ($('#element').length) {
$('#element').click();
clearInterval(checkForItem);
}
}, 100);
}
想象一下这些函数中的5个(one
,two
,three
,four
,five
),所有函数都使用相同的格式{{1}和以下setInterval
循环:
while
在继续循环之前,我将如何确保所有功能一个接一个地发生?
注意:我尝试过使用promises,虽然由于函数是异步的,循环仍然在函数完成之前继续。
答案 0 :(得分:3)
使用async
/ await
语法和promises:
function delay(t) {
return new Promise(resolve => setTimeout(resolve, t));
}
async function one() {
while (!$('#element').length) {
await delay(100);
}
$('#element').click();
}
async function main() {
for (var x = 0; x < 10; x++) {
await one();
await two();
await three();
await four();
await five();
}
}
答案 1 :(得分:0)
定义数组中的选择器,并逐渐迭代数组中的数组,直到到达数组的末尾:
.mainloop()
但是如果你在元素被添加到DOM时尝试触发一个函数(例如点击一个元素的东西),那么在时使用触发的东西会好得多。发生添加,例如创建者函数中的回调,或MutationObserver
答案 2 :(得分:-1)
尝试使用async等待包裹承诺:
async function one (){
await (new Promise(function(reolve, reject){
var checkForItem = setInterval(function () {
if ($('#element').length) {
$('#element').click();
clearInterval(checkForItem);
resolve();
}
}, 100);
}));
}
//And then in your while loop:
while (x < y){
await one();
await two();
...
x++
}
note :您的while循环也必须包含在异步函数中。