事件监听器Javascript

TSR

我有3个实例Foo()我们称它们为foo1, foo2foo3默认情况下,的适当isReadyFoo()false在的构造函数中Foo(),有一个设置isReady为true的异步方法例如,我可能会setTimout经历不同的持续时间。在实例化这3个实例之后,有一个名为的函数:startMainAction()仅应在foo1.isReady = true之后调用foo2.isReady = true并且foo3.isReady = true鉴于异步函数未确定(可能是随机持续时间),因此无法确定foo实例的顺序。有他们的礼节isReady设置true因此,我认为我不能使用回调来调用startMainAction

如何实现?

 class Foo{
    
  constructor(n){
    this.isReady = false;
    setTimeout(()=>{
    this.isReady = true;
    console.log('I am ready '+n);
    }, Math.random()*1000)
  }
}
    
    
const foo1 = new Foo(1)
const foo2 = new Foo(2)
const foo3 = new Foo(3)
    
    
function startMainAction(){
    
    console.log('All fooes must be ready before I was called')
 }

一定的表现

一种选择是添加一个设置isReady为true的方法,该方法添加要调用的回调

onReady(callback) {
  this.readyCallbacks.push(callback);
}

然后,使用这三个实例,onReadyresolvePromise的进行调用,并调用Promise.all这三个Promise

const foos = [foo1, foo2, foo3];
Promise.all(foos.map(foo => new Promise(resolve => foo.onReady(resolve))))
  .then(startMainAction);

class Foo {
  constructor() {
    this.readyCallbacks = [];
    this.isReady = false;
    setTimeout(() => {
      this.isReady = true;
      console.log('I am ready');
      this.readyCallbacks.forEach(callback => callback());
    }, Math.random() * 1500)
  }
  onReady(callback) {
    this.readyCallbacks.push(callback);
  }
}

const foo1 = new Foo()
const foo2 = new Foo()
const foo3 = new Foo()
function startMainAction() {
  console.log('All fooes must be ready before I was called')
}
const foos = [foo1, foo2, foo3];
Promise.all(foos.map(foo => new Promise(resolve => foo.onReady(resolve))))
  .then(startMainAction);

我想您也可以readyCallback在构造函数中传递,这会减少代码的数量,但这似乎不太合适,因为Foo(比如说foo4)可能不需要a readyCallback,并且创建实例readyCallback不是必需的,它是代码其他部分要求添加到实例的处理程序。(例如,如果您的代码中两个部分必须监听isReadyof foo1,则需要类似此onReady方法的东西。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章