- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设 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);
}
最佳答案
我认为解决您问题的最简单方法是将 setTimeout
包装在 Promise
中,然后使用 async
/等待
。这样您就可以使用您已经设置好的相同控制流。
您应该使用 setTimeout
而不是 setInterval
。 setInterval
按设定的时间间隔定期运行,但您的 while
循环已经多次运行您的代码,因此您应该使用 setTimeout
而不是只运行一次回调。
为了让事情更简单,我会将 setTimeout
包装在 Promise
中,这样您就可以使用 async
和 等待
。
async
是您放置在函数上的修饰符,它允许您使用关键字 await
。 await
所做的是在运行下一段代码之前解开 promise 并等待它们解决。它允许您使用简单的同步控制流,即使代码实际上是异步的。
我所做的是创建一个 async
函数 main
(不过你可以随意调用它)它是 await
包装的 >setTimeout
函数。现在该函数将等待时间结束,然后运行下一段代码。
希望对您有所帮助!
a Note on browser compatibility: Async and await is from the lastest javascript standard so it won't work on IE. You can use babel to converter newer javascript to older javascript if you need to.
function time(milliseconds) {
return new Promise(resolve => setTimeout(() => resolve(), milliseconds));
}
function first () {
// const expand = document.querySelector('a');
// expand.click();
console.log('first ran');
}
function second() {
// const something = document.querySelector('a');
// something.click();
console.log('second ran');
}
function third() {
// const area = document.querySelector('.class');
// const confirm = document.querySelector('.confirm');
// confirm.click();
console.log('third ran');
}
async function main() {
const times = 100;
let ran = 0;
while (ran < times) {
first();
await time(1000);
second();
await time(1000);
third();
await time(1000);
ran++;
console.log(ran);
}
}
main();
来自您的评论:
Thanks! Also curious, the best possible solution for me would be to be able to step through these using yield so I can call main().next(). Do you know how to structure that as a generator with the same time promise? Would love the help on that
我认为这不是您想要的,但它可以满足您的要求。也许我得再考虑一下……
无论如何,run
现在是一个返回 promise 的函数,在 make
函数中,它 yield
是 promise run
返回。所以现在在另一个异步函数中你可以await
它们的value
。
同样,我认为这不是你想要的,但如果你阐明你的意图,我可以给你另一个建议。
function time(milliseconds) {
return new Promise(resolve => setTimeout(() => resolve(), milliseconds));
}
function first () {
// const expand = document.querySelector('a');
// expand.click();
console.log('first ran');
}
function second() {
// const something = document.querySelector('a');
// something.click();
console.log('second ran');
}
function third() {
// const area = document.querySelector('.class');
// const confirm = document.querySelector('.confirm');
// confirm.click();
console.log('third ran');
}
async function run() {
first();
await time(1000);
second();
await time(1000);
third();
await time(1000);
}
function* make() {
const times = 100;
let ran = 0;
while (ran < times) {
yield run();
ran++;
console.log(ran);
}
}
async function main() {
const iterator = make();
await iterator.next().value;
await iterator.next().value;
await iterator.next().value;
await iterator.next().value;
}
main();
关于javascript - 我如何遍历 3 个 setInterval 函数,但将它们链接为 promises,以便解决并继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094429/
这个问题已经有答案了: JavaScript closure inside loops – simple practical example (45 个回答) 已关闭 8 年前。 我试图创建多个 se
这是我的情况,我需要加快函数运行时间,所以 setInterval 不是一个明智的选择,对吧?因为每次至少要花费 4 毫秒。 所以,我可以将 setInterval 函数更改为 requestAnim
我正在尝试下面的代码,看看是否可以将 setInterval Id 存储为关联数组中唯一键的值,然后通过使用唯一值作为键来停止被调用函数中的间隔,如下所示我将 setInterval Id 作为它的值
我花了很长时间试图弄清楚如何使用具有 CSS 样式缓动功能的 Google Maps API 为折线上的符号设置动画。我让它工作 with this Gist和 this Google Maps AP
我是这里的 JS 新手,正在研究一个在给定时间段后开始的倒数计时器。基本上,当用户单击按钮时时钟开始,第二个时钟在第一个计时器用完时开始。我知道“setInterval”是完成这个的最好方法。我面临的
嗨, friend 们,我想只使用一个 setInterval 函数来运行我的代码。目前我正在使用两个 setInterval's 来实现我的目标,我们可以只使用一个 'setInterval' 来获
我的“setInterval”函数有问题,我想在将鼠标悬停在 div 上时启动该函数,但是 setInterval 在我将鼠标悬停在 div 上时第一次起作用=>如果我停留在div,它不会继续改变图片
我想展示两次:一次在你的国家,一次在日本用JS 问题是第二个 setInterval 停止了第一个,我不知道如何进行两次运行。 完整代码 In your region:
好吧,这个问题有几个问题。 首先,我要求 setTimeout() 和 setInterval() 我见过几种不同的调用方式,我想知道哪种方式最适合这种情况。 我正在制作一个 js/canvas 游戏
setInterval(function () { //======= //code //======== if(--timer&etype="; } },1000); 这里定时器结束后,而不是重定
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
我的前老板有一个 weird bug where when he used setInterval with a long delay interval : setInterval(func, 300
这个问题已经有答案了: How does the "this" keyword work, and when should it be used? (22 个回答) How to access the
我的印象是 setInterval("/*some code*/", time) 相当于 setInterval(function() { /*some code*/ }, time) 显然不是
我对 JavaScript 和 NodeJS 非常陌生,我只是想了解 NodeJS 中的发射器模式。当我尝试使用 setInterval 函数每秒发出一个刻度事件时,程序似乎工作正常:-
我有一个简单的 setTimeout 函数,它在特定时间运行并且工作正常: var now = new Date(); var milliTillExec = new Date(now.getFull
在本教程中,您将借助示例了解 JavaScript setInterval() 方法。 在 JavaScript 中,可以在指定的时间间隔内执行一段代码。这些时间间隔称为定时事件。 有
Js: function cometConnect(){ $.ajax({ cache:false, type:"post", d
LE2。关于如何解决此问题的任何其他想法? 我有这段代码,但不知道为什么不能正常工作: $(function autorun() { if ($("#contactForm").is(":visibl
这个问题在这里已经有了答案: How to make a setInterval stop after some time or after a number of actions? (6 个答案)
我是一名优秀的程序员,十分优秀!