Один из вариантов - добавить метод, который добавляет обратный вызов для вызова, если для isReady
установлено значение true:
onReady(callback) {
this.readyCallbacks.push(callback);
}
Затем, с этими тремя случаями, позвоните onReady
с resolve
Обещания и назовите Promise.all
на этих трех Обещаниях:
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
), возможно, не нужно readyCallback
, а readyCallback
не необходим для создания экземпляра, это обработчик, который другие части кода запрашивают для добавления к экземпляру. (например, если у вас есть две части кода, которые должны были прослушивать isReady
из foo1
, вам понадобится что-то вроде этого onReady
метода.)