使JavaScript函数在两个或多个事件发生后运行?

使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()只在三次之

我的HTML页面:

<!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时执行,并且您可以使用帮助器函数检查全局数组的索引值