Javascript 如何在3个setInterval函数上循环,但将它们链接为承诺,以便解决问题并继续?
假设Javascript 如何在3个setInterval函数上循环,但将它们链接为承诺,以便解决问题并继续?,javascript,asynchronous,promise,google-chrome-devtools,Javascript,Asynchronous,Promise,Google Chrome Devtools,假设first()、second()和third()函数工作,我如何在一个循环中将它们异步链接在一起,以便第一个解析,然后第二个在第一个解析后访问DOM,等等 所以我可以点击类似的DOM项目,一遍又一遍地执行3个操作 // first() pops up a list of buttons I can click var first = setInterval(function() { var expand = document.querySelector('a'); expand.cl
first()
、second()
和third()
函数工作,我如何在一个循环中将它们异步链接在一起,以便第一个解析,然后第二个在第一个解析后访问DOM,等等
所以我可以点击类似的DOM项目,一遍又一遍地执行3个操作
// first() pops up a list of buttons I can click
var first = setInterval(function() {
var expand = document.querySelector('a');
expand.click();
}, 1000);
// second() chooses an item and clicks it
var second = setInterval(function() {
var something = document.querySelector('a');
something.click();
}, 1000);
// third then chooses the confirm button
var third = setInterval(function() {
var area = document.querySelector('.class');
var confirm = document.querySelector('.confirm');
confirm.click();
}, 1000);
var times = 100;
var ran = 0;
while (ran < times) {
return new Promise(function(res, rej) {
first()
}).then(function() {
second()
}).then(function() {
third();
}).then(function() {
fourth();
});
ran++;
console.log(ran);
}
//first()弹出我可以单击的按钮列表
var first=setInterval(函数(){
var expand=document.querySelector('a');
展开。单击();
}, 1000);
//second()选择一个项目并单击它
var second=setInterval(函数(){
var something=document.querySelector('a');
有东西。点击();
}, 1000);
//然后选择确认按钮
var third=setInterval(函数(){
var区域=document.querySelector('.class');
var confirm=document.querySelector('.confirm');
确认。单击();
}, 1000);
var倍=100;
var-ran=0;
while(运行<次){
返回新承诺(功能(res、rej){
第一()
}).然后(函数(){
第二()
}).然后(函数(){
第三();
}).然后(函数(){
第四();
});
ran++;
console.log(ran);
}
我认为解决问题的最简单方法是将设置超时
包装在承诺
中,然后使用异步
/等待
,这样您就可以使用已经设置好的相同控制流
您应该使用setTimeout
而不是setInterval
setInterval
以设置的时间间隔定期运行,但是您的while
循环已经多次运行代码,因此您应该使用setTimeout
而不是只运行一次回调
为了使事情更简单,我将setTimeout
包装在Promise
中,这样您就可以使用async
和wait
async
是对函数的一个修饰符,允许您使用关键字wait
等待所做的是在运行下一位代码之前,它打开承诺并等待它们解决。它允许您使用简单的同步控制流,即使代码实际上是异步的
我所做的是创建一个async
函数main
(您可以随意调用它),该函数wait
s包装的setTimeout
函数。现在,该函数将等待时间结束,然后运行下一段代码
希望有帮助
关于浏览器兼容性的注意事项:Async和await来自最新的javascript标准,因此在IE上不起作用
功能时间(毫秒){
返回新承诺(resolve=>setTimeout(()=>resolve(),毫秒));
}
函数优先(){
//const expand=document.querySelector('a');
//展开。单击();
log(“第一次运行”);
}
函数第二(){
//const something=document.querySelector('a');
//有东西。点击();
log(“第二次运行”);
}
函数第三(){
//const area=document.querySelector('.class');
//const confirm=document.querySelector('.confirm');
//确认。单击();
console.log(“第三次运行”);
}
异步函数main(){
常数倍=100;
设ran=0;
while(运行<次){
第一个();
等待时间(1000);
第二个();
等待时间(1000);
第三();
等待时间(1000);
ran++;
console.log(ran);
}
}
main()
如果你想走承诺之路,那么首先我建议你使用setTimeout
而不是setInterval
,因为你会重复承诺,因为承诺只解决一次。为什么这些都在setInterval()
中setInterval()
会反复运行,直到您清除间隔。非常感谢。我有另一个版本的代码,它几乎与async/await一起出现。我错过的一件事是在异步函数中包装while循环。谢谢同样奇怪的是,对我来说最好的解决方案是能够使用yield逐步完成这些操作,这样我就可以调用main().next()。您知道如何将其构造为具有相同时间承诺的发电机吗?我很想得到你的帮助我在想这个。。。但我认为它只是单击了第一个()并再次切换,所以我做错了什么。{function*go(){const times=10;let ran=0;while(rango()
直到所有帖子都被删除。但理想情况下,我希望它作为一个循环工作。我认为这是一件非常重要的事情,因为third()
中的选择器基于一个在第一次循环迭代完成后不会更新的类。所以我被困在那里,但感觉非常接近。