timeout.js 1021 B

123456789101112131415161718192021222324252627282930313233343536
  1. "use strict";
  2. var customError = require("es5-ext/error/custom")
  3. , isValue = require("es5-ext/object/is-value")
  4. , ensurePromise = require("es5-ext/object/ensure-promise")
  5. , nextTick = require("next-tick")
  6. , ensureTimeout = require("../valid-timeout");
  7. module.exports = function (/* timeout */) {
  8. ensurePromise(this);
  9. var timeout = arguments[0];
  10. if (isValue(timeout)) timeout = ensureTimeout(timeout);
  11. return new this.constructor(
  12. function (resolve, reject) {
  13. var isSettled = false, timeoutId;
  14. var timeoutCallback = function () {
  15. if (isSettled) return;
  16. reject(customError("Operation timeout", "PROMISE_TIMEOUT"));
  17. };
  18. if (isValue(timeout)) timeoutId = setTimeout(timeoutCallback, timeout);
  19. else nextTick(timeoutCallback);
  20. this.then(
  21. function (value) {
  22. isSettled = true;
  23. clearTimeout(timeoutId);
  24. resolve(value);
  25. },
  26. function (reason) {
  27. isSettled = true;
  28. clearTimeout(timeoutId);
  29. reject(reason);
  30. }
  31. );
  32. }.bind(this)
  33. );
  34. };