fast-merge-async-iterators
Version:
Merge AsyncIterables with all corner cases covered.
40 lines • 1.55 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const _1 = __importDefault(require("."));
async function* generator(name, dt) {
try {
for (let i = 0;; i++) {
console.log(`${name} yielded ${i}`);
yield `${name}: ${i}`;
await new Promise((resolve) => setTimeout(resolve, dt));
}
}
finally {
console.log(`Closing ${name} (doing some cleanup)`);
await new Promise((resolve) => setTimeout(resolve, 100));
}
}
async function* caller() {
// JS does a good job of propagating iterator close operation (i.e.
// calling `.return()` an iterator is used in `yield*` or `for await`).
yield* (0, _1.default)("iters-close-wait", generator("A", 222), generator("B", 555));
// Available modes:
// - "iters-noclose" (does not call inner iterators' `return` method)
// - "iters-close-nowait" (calls `return`, but doesn't await nor throw)
// - "iters-close-wait" (calls `return` and awaits for inners to finish)
}
(async () => {
for await (const message of caller()) {
if (message.includes("2")) {
// This `break` closes the merged iterator, and the signal is
// propagated to all inner iterators.
break;
}
console.log(`Received from ${message}`);
}
console.log("Finishing");
})();
//# sourceMappingURL=example.js.map