hubs
Version:
``` Caryl ------ courier3 / \ / \ courier1 courier2
45 lines (39 loc) • 1.17 kB
JavaScript
module.exports = function promiseTree(items, callback) {
var waitingDefers = {}
// promise tree
var keys = Object.keys(items)
keys.forEach(key => {
// promise for waiting dependency
waitingDefers[key] = defer()
waitingDefers[key].promise = waitingDefers[key].promise
.then((data) => {
return callback({data, key})
})
if (!items[key].dep) {
waitingDefers[key].resolve([])
}
});
keys.forEach(key => {
if (!items[key].dep) return
// use Promise.all to wait for dependency, and then resolve the waitingDefer
Promise.all(
items[key].dep.map(k => {
return waitingDefers[k].promise
})
).then(waitingDefers[key].resolve)
});
return Promise.all(keys.map(key => waitingDefers[key].promise))
}
function defer() {
var resolve = null;
var reject = null;
var promise = new Promise(function (rs, rj) {
resolve = rs;
reject = rj;
});
return {
promise,
resolve,
reject
}
}