- 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!