使JavaScript函数在两个或多个事件发生后运行?
我的HTML页面:使JavaScript函数在两个或多个事件发生后运行?,javascript,callback,Javascript,Callback,我的HTML页面: <!DOCTYPE html> <html> <head> <title>Foo</title> <script src="foo.js"></script> </head> <body> <p>Foo</p> </body> </html> 我想做的是:确保work()只在三次之
<!DOCTYPE html>
<html>
<head>
<title>Foo</title>
<script src="foo.js"></script>
</head>
<body>
<p>Foo</p>
</body>
</html>
我想做的是:确保work()
只在三次之后运行
已发生事件:onEvent1
、onEvent2
和window.onload
我已经用setTimeout
实现了onEvent1
和onEvent2
,但是
可以有任何异步调用回调的实现
是否有任何JavaScript概念可以让我确保work()
在三个事件发生后自动调用,而我没有
使用我在中实现的检查和重试机制对其进行硬编码
workInvoker()
?只要在每个事件上调用workInvoker
function main() {
var event1Done = false
var event2Done = false
var windowLoadDone = false
onEvent1(function () {
event1Done = true
console.log('first event done')
workInvoker()
})
onEvent2(function () {
event2Done = true
console.log('second event done')
workInvoker()
})
window = {}
window.onload = function() {
windowLoadDone = true
console.log('window load done')
workInvoker()
}
function workInvoker() {
// check
if (event1Done && event2Done && windowLoadDone) {
work()
}
}
}
只要在每次事件中调用
workInvoker
function main() {
var event1Done = false
var event2Done = false
var windowLoadDone = false
onEvent1(function () {
event1Done = true
console.log('first event done')
workInvoker()
})
onEvent2(function () {
event2Done = true
console.log('second event done')
workInvoker()
})
window = {}
window.onload = function() {
windowLoadDone = true
console.log('window load done')
workInvoker()
}
function workInvoker() {
// check
if (event1Done && event2Done && windowLoadDone) {
work()
}
}
}
我开始写菲利克斯写的东西。所以+1表示:D使用查找对象而不是局部变量会更短,但这是手动方法 使用
Promise.all
,您可以更清晰地使用承诺做同样的事情,前提是您的回调已被承诺:
Promise.all(
promiseOfEvent1,
promiseOfEvent2,
promiseOfWindowLoad
).then(results => {
work();
})
在哪里
const promiseOfWindowLoad = new Promise(function(resolve, reject) {
window.onload = resolve;
});
我开始写菲利克斯写的东西。所以+1表示:D使用查找对象而不是局部变量会更短,但这是手动方法 使用
Promise.all
,您可以更清晰地使用承诺做同样的事情,前提是您的回调已被承诺:
Promise.all(
promiseOfEvent1,
promiseOfEvent2,
promiseOfWindowLoad
).then(results => {
work();
})
在哪里
const promiseOfWindowLoad = new Promise(function(resolve, reject) {
window.onload = resolve;
});
每次调用三个函数中的一个时,您可以使用增加1的计数器变量。当计数器的值达到3时,u可以执行work()函数,即,如果计数器==3,则执行workInvoker()函数,否则它不会执行 或 如果要确保所有三个索引值都执行,可以使用大小为3的全局数组,并将0分配给所有三个索引值。将0,1,2分配给您要执行的上述三个函数。 如果这些函数中的任何一个被调用,则u可以将其在全局中的相应索引值更新1。然后,即使它被称为mutliple times,也只保留索引值为1。
函数workInvoker()仅在全局数组的所有三个索引值都为1时执行,并且您可以使用一个辅助函数来检查全局数组的索引值。您可以使用一个计数器变量,该变量在每次调用三个函数中的一个时增加1。当计数器的值达到3时,u可以执行work()函数,即,如果计数器==3,则执行workInvoker()函数,否则它不会执行 或 如果要确保所有三个索引值都执行,可以使用大小为3的全局数组,并将0分配给所有三个索引值。将0,1,2分配给您要执行的上述三个函数。 如果这些函数中的任何一个被调用,则u可以将其在全局中的相应索引值更新1。然后,即使它被称为mutliple times,也只保留索引值为1。 函数workInvoker()将仅在全局数组的所有三个索引值都为1时执行,并且您可以使用帮助器函数检查全局数组的索引值