Advertisement
lignite0

Async XML generation

May 21st, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const master = new class {
  2.     constructor() {
  3.         this.done = false;
  4.         this.listeners = [];
  5.     }
  6.  
  7.     async* makeGenerator(filterCallback) {
  8.         while (true) {
  9.             const {element, resolve} = await new Promise((resolve, reject) => {
  10.                 this.listeners.push(resolve);
  11.             });
  12.  
  13.             if (element === null) {
  14.                 resolve();
  15.                 break;
  16.             }
  17.  
  18.             if (filterCallback(element)) {
  19.                 yield Promise.resolve(element);
  20.             }
  21.  
  22.             resolve();
  23.         }
  24.     }
  25.  
  26.     subscribe(element) {
  27.         const promise = Promise.all(this.listeners.map(listener => {
  28.             return new Promise(resolve => {
  29.                 listener({element, resolve});
  30.             });
  31.         }));
  32.         this.listeners = [];
  33.         return promise;
  34.     }
  35.  
  36.     complete() {
  37.         this.subscribe(null);
  38.     }
  39. }();
  40.  
  41. for (let space of ["a", "b"]) {
  42.     (async function () {
  43.         const result = [];
  44.         console.log("start", space);
  45.         for await (let object of master.makeGenerator(element => element.char === space)) {
  46.             console.log("space", object);
  47.             result.push(object);
  48.         }
  49.         console.log("end", space);
  50.         console.log(result);
  51.     })();
  52. }
  53. console.log('test');
  54.  
  55. const data = [
  56.     1, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2,
  57. ].map((number, index) => ({char: number === 1 ? "a" : "b", index}));
  58.  
  59. (async function () {
  60.     for (let element of data) {
  61.         console.log("element", element);
  62.         await master.subscribe(element);
  63.     }
  64.     master.complete();
  65. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement