{"id":18924629,"url":"https://github.com/dash-os/promise-queue-observable","last_synced_at":"2026-03-14T04:30:18.574Z","repository":{"id":65475807,"uuid":"93008777","full_name":"Dash-OS/promise-queue-observable","owner":"Dash-OS","description":"Build Observables composed of producers pushing args and consumers handling Promises","archived":false,"fork":false,"pushed_at":"2017-06-01T03:05:22.000Z","size":6,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-31T20:54:24.578Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dash-OS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-06-01T02:36:47.000Z","updated_at":"2018-02-26T17:32:23.000Z","dependencies_parsed_at":"2023-01-25T06:15:16.891Z","dependency_job_id":null,"html_url":"https://github.com/Dash-OS/promise-queue-observable","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dash-OS%2Fpromise-queue-observable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dash-OS%2Fpromise-queue-observable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dash-OS%2Fpromise-queue-observable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dash-OS%2Fpromise-queue-observable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dash-OS","download_url":"https://codeload.github.com/Dash-OS/promise-queue-observable/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239921875,"owners_count":19718842,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T11:07:38.965Z","updated_at":"2026-03-14T04:30:18.505Z","avatar_url":"https://github.com/Dash-OS.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# promise-queue-observable\n\nA Queue implemented on top of the simple [SetQueue](https://github.com/Dash-OS/set-queue) \npackage.  It implements a two-sided queue using promises where any number of publishers \ncan dispatch events to any number of consumers.\n\n```js\nimport PromiseQueue from 'promise-queue-observable'\n\nconst observer = new PromiseQueue({\n  /* Default Configuration */\n  // Feel free to provide a different Promise implementation.\n  promise: Promise,\n  /* optional callback made when the Queue is cancelled through observer.cancel()\n     the callback is made with the PromiseQueue instances this binding.\n  */\n  onCancel: undefined,\n  /* queueStyle allows you to adjust how the queue is handled.  When 'next' (default)\n     any calls to observer.next() will return the same promise until a new value has \n     been resolved.  \n     \n     If queueStyle is 'shift' then each call to observer.next() will return a new \n     promise that will resolve after all other promises ahead of it have been \n     resolved.\n  */\n  queueStyle: 'next',\n  /* any time a new promise is created - if promiseFactory is given the promise is \n     sent to the factory with 'pull' or 'push' and the promise instance.\n     expects the promise as a response.  this is used to modify the promise to make \n     it operate with 3rd party libraries like redux-saga's cancellation.\n     (type, Promise)\n  */\n  promiseFactory: undefined,\n  /* Log Errors ?\n  */\n  log: false,\n})\n```\n\n\n\n### Simple Example\n\n```js\nimport PromiseQueue from 'promise-queue-observable'\n\n// Create an Observable\nconst observable = new PromiseQueue()\n\n// consumers request promises - this promise will resolve when a \n// publisher provides a value.\nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [1, 2, 3]\n  })\n  .catch(e =\u003e {\n    console.log(e) ; \n  })\n  \nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [1, 2, 3]\n  })\n  .catch(e =\u003e {\n    console.log(e) ; \n  })\n\n// ... sometime later\nobservable.publish(1, 2, 3)\nobservable.publish(2, 3, 4)\nobservable.throw(new Error('some error'))\n\nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [2, 3, 4]\n  })\n  .catch(e =\u003e {\n    console.log(e) ;\n  })\n  \nobservable.next()\n  .then(result =\u003e {\n    console.log(result)\n  })\n  .catch(e =\u003e {\n    console.log(e.message) ; // some error\n  })\n```\n\n### Shift Example\n\n```js\nimport PromiseQueue from 'promise-queue-observable'\n\n// Create an Observable\nconst observable = new PromiseQueue({\n  queueStyle: 'shift'\n})\n\n\n// consumers request promises - this promise will resolve when a \n// publisher provides a value.\nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [1, 2, 3]\n  })\n  .catch(e =\u003e {\n    console.log(e) ; \n  })\n  \nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [2, 3, 4]\n  })\n  .catch(e =\u003e {\n    console.log(e) ; \n  })\n\n// ... sometime later\nobservable.publish(1, 2, 3)\nobservable.publish(2, 3, 4)\nobservable.throw(new Error('some error'))\n\nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ;\n  })\n  .catch(e =\u003e {\n    console.log(e) ; // some error\n  })\n  \nobservable.next()\n  .then(result =\u003e {\n    console.log(result) ; // [ 5, 6, 7 ]\n  })\n  .catch(e =\u003e {\n    console.log(e.message) ;\n  })\n  \nsetTimeout(() =\u003e observable.publish(5, 6, 7), 5000)\n```\n\n### Promisifying Callbacks\n\nBelow we are iterating the observables value and composing them over time \nuntil the observable is cancelled (or we don't return getNextEvent).  The \ninitial caller receives the final results.\n\n```js\nimport PromiseQueue from 'promise-queue-observable'\n\n// Create an Observable\nconst observable = new PromiseQueue({ \n  log: true,\n  onCancel: function handlePromiseQueueCancellation() {\n    // handle cancellation however needed\n  }\n})\n\nconst getNextEvent = prev =\u003e (\n  observable.cancelled() \n    ? prev\n    : observable.next().then(value =\u003e {\n      console.log('value: ', value)\n      console.log('prev:  ', prev)\n      return getNextEvent([ ...prev || [], ...e ])\n    }).catch(e =\u003e {\n      console.log('Error! ', e)\n    })\n)\n\ngetNextEvent().then(r =\u003e {\n  console.log('result ', r)\n  if ( ! observable.cancelled() ) {\n    observable.cancel() ; // cleanup the queues and prevent publishers from \n                          // continually publishing to a queue that no one\n                          // will ever consume by accident.\n  }\n})\n\n// works geat for things like window.addEventListener, etc.\nsetTimeout(() =\u003e observable.publish(1), 1000)\nsetTimeout(() =\u003e observable.publish(2), 3000)\nsetTimeout(() =\u003e observable.publish(3), 2000)\nsetTimeout(() =\u003e observable.publish(4), 6000)\nsetTimeout(() =\u003e observable.cancel(), 3000)\n\n/*\nvalue:  [ 1 ]\nprev:   undefined\nvalue:  [ 3 ]\nprev:   [ 1 ]\nvalue:  [ 2 ]\nprev:   [ 1, 3 ]\nresult  [ 1, 3, 2 ]\n[SagaObservable]: Publish Received after Cancellation  undefined [ 4 ]\n*/\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdash-os%2Fpromise-queue-observable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdash-os%2Fpromise-queue-observable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdash-os%2Fpromise-queue-observable/lists"}