Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在3个setInterval函数上循环,但将它们链接为承诺,以便解决问题并继续?_Javascript_Asynchronous_Promise_Google Chrome Devtools - Fatal编程技术网

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()
中的选择器基于一个在第一次循环迭代完成后不会更新的类。所以我被困在那里,但感觉非常接近。