radixjs
Version:
RadixJS 3.0.0
51 lines (48 loc) • 1.59 kB
JavaScript
function controlFlowCall(controlFlow) {
let next = (iter, cb, ecb, prev = undefined) => {
const item = iter.next(prev);
const value = item.value;
if (item.done) return cb(prev);
if (isPromise(value)) {
value.then(val => {
try {
setImmediate(() => next(iter, cb, ecb, val));
} catch (e) {
ecb(e);
}
}).catch(error => {
ecb(error);
});
} else if (Array.isArray(value) && value.length > 0 && isPromise(value[0])) {
Promise.all(value).then(val => {
try {
setImmediate(() => next(iter, cb, ecb, val));
} catch (e) {
ecb(e);
}
}).catch(error => {
ecb(error);
});
} else {
try {
setImmediate(() => next(iter, cb, ecb, value));
} catch (e) {
ecb(e);
}
}
};
return (...args) => (new Promise((resolve, reject) => {
let potentialIterator = controlFlow(...args);
if (potentialIterator && potentialIterator.next && typeof potentialIterator.next === "function") {
next(potentialIterator, val => resolve(val), val => {
reject(val)
});
} else {
try {
resolve(potentialIterator);
} catch (e) {
console.log("\033[37m asd" + e + "\033[0m");
}
}
}));
}