12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- "use strict";
- var customError = require("es5-ext/error/custom")
- , isValue = require("es5-ext/object/is-value")
- , ensurePromise = require("es5-ext/object/ensure-promise")
- , nextTick = require("next-tick")
- , ensureTimeout = require("../valid-timeout");
- module.exports = function (/* timeout */) {
- ensurePromise(this);
- var timeout = arguments[0];
- if (isValue(timeout)) timeout = ensureTimeout(timeout);
- return new this.constructor(
- function (resolve, reject) {
- var isSettled = false, timeoutId;
- var timeoutCallback = function () {
- if (isSettled) return;
- reject(
- customError(
- "Operation timeout (exceeded " +
- (isValue(timeout) ? timeout + "ms" : "tick") +
- ")",
- "PROMISE_TIMEOUT"
- )
- );
- };
- if (isValue(timeout)) timeoutId = setTimeout(timeoutCallback, timeout);
- else nextTick(timeoutCallback);
- this.then(
- function (value) {
- isSettled = true;
- clearTimeout(timeoutId);
- resolve(value);
- },
- function (reason) {
- isSettled = true;
- clearTimeout(timeoutId);
- reject(reason);
- }
- );
- }.bind(this)
- );
- };
|