我有3个实例Foo()
。我们称它们为foo1, foo2
和foo3
。默认情况下,的适当isReady
性Foo()
是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);
}
然后,使用这三个实例,onReady
用resolve
Promise的进行调用,并调用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
不是必需的,它是代码其他部分要求添加到实例的处理程序。(例如,如果您的代码中有两个部分必须监听isReady
of foo1
,则需要类似此onReady
方法的东西。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句