Моя HTML-страница:
<!DOCTYPE html>
<html>
<head>
<title>Foo</title>
<script src="foo.js"></script>
</head>
<body>
<p>Foo</p>
</body>
</html>
Сценарий foo.js
:
function onEvent1(callback) {
console.log('registered callback for first event')
setTimeout(callback, 1000)
}
function onEvent2(callback) {
console.log('registered callback for second event')
setTimeout(callback, 2000)
}
function work() {
console.log('work done')
}
function main() {
var event1Done = false
var event2Done = false
var windowLoadDone = false
onEvent1(function () {
event1Done = true
console.log('first event done')
})
onEvent2(function () {
event2Done = true
console.log('second event done')
})
window = {}
window.onload = function() {
windowLoadDone = true
console.log('window load done')
}
function workInvoker() {
// check
if (event1Done && event2Done && windowLoadDone) {
work()
} else {
// retry
setTimeout(workInvoker, 1000)
}
}
workInvoker()
}
main()
Что я пытаюсь сделать: убедитесь, что work()
работает только после трех
произошли события: onEvent1
, onEvent2
и window.onload
.
Я реализовал onEvent1
и onEvent2
с setTimeout
, но это
может иметь любую реализацию, которая вызывает обратный вызов асинхронно.
Существует ли какая-либо концепция JavaScript, которая позволила бы мне убедиться, что work()
автоматически вызывается после того, как три события происходят без меня
жестко закодировать его с помощью механизма проверки и повтора, который я реализовал в
workInvoker()