Skip to content

Instantly share code, notes, and snippets.

@marshall-lee
Last active April 28, 2019 11:26
Show Gist options
  • Save marshall-lee/1fe5f961425ae6268283dd0de41bc908 to your computer and use it in GitHub Desktop.
Save marshall-lee/1fe5f961425ae6268283dd0de41bc908 to your computer and use it in GitHub Desktop.
class Container {
constructor() {
this.defResolvers = {};
this.defPromises = {};
}
require(depList, body) {
let depPromises = depList.map(d => this.defPromise(d));
return Promise.all(depPromises)
.then((deps) => body(...deps))
.catch(name => {
throw `Unable to require ${name}`;
});
}
define(name, depList, definition) {
let resolver = this.defResolver(name);
return this.require(depList, (...deps) => resolver(definition(...deps)));
}
defPromise(name) {
if (!this.defPromises[name]) {
this.defPromises[name] = new Promise((resolve, reject) => {
let timer = setTimeout(() => reject(name), 1000);
this.defResolvers[name] = obj => { clearTimeout(timer); return resolve(obj) };
});
}
return this.defPromises[name];
}
defResolver(name) {
this.defPromise(name);
return this.defResolvers[name];
}
}
var ties = new Container;
ties.require(["messenger", "privet"], ({ Email, Sms }, privet) => {
privet();
// ....
});
ties.define("messenger", [], () => {
class Email {}
class Sms {}
return { Email, Sms };
});
ties.define("privet", [], () => {
return () => { console.log('privet') };
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment