PendingOperation.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict';
  2. const TimeoutError = require('./TimeoutError').TimeoutError;
  3. const defer = require('./utils').defer;
  4. class PendingOperation {
  5. constructor(timeoutMillis) {
  6. this.deferred = defer();
  7. this.possibleTimeoutCause = null;
  8. this.promise = timeout(this.deferred.promise, timeoutMillis).catch(err => {
  9. if (err instanceof TimeoutError) {
  10. if (this.possibleTimeoutCause) {
  11. err = new TimeoutError(this.possibleTimeoutCause.message);
  12. } else {
  13. err = new TimeoutError('operation timed out for an unknown reason');
  14. }
  15. }
  16. return Promise.reject(err);
  17. });
  18. }
  19. abort() {
  20. this.reject(new Error('aborted'));
  21. }
  22. reject(err) {
  23. this.deferred.reject(err);
  24. }
  25. resolve(value) {
  26. this.deferred.resolve(value);
  27. }
  28. }
  29. function timeout(promise, time) {
  30. return new Promise((resolve, reject) => {
  31. const timeoutHandle = setTimeout(() => reject(new TimeoutError()), time);
  32. promise
  33. .then(result => {
  34. clearTimeout(timeoutHandle);
  35. resolve(result);
  36. })
  37. .catch(err => {
  38. clearTimeout(timeoutHandle);
  39. reject(err);
  40. });
  41. });
  42. }
  43. module.exports = {
  44. PendingOperation
  45. };