UNPKG

2.4 kBJavaScriptView Raw
1"use strict";
2module.exports = function(Promise, INTERNAL, debug) {
3var util = require("./util");
4var TimeoutError = Promise.TimeoutError;
5
6function HandleWrapper(handle) {
7 this.handle = handle;
8}
9
10HandleWrapper.prototype._resultCancelled = function() {
11 clearTimeout(this.handle);
12};
13
14var afterValue = function(value) { return delay(+this).thenReturn(value); };
15var delay = Promise.delay = function (ms, value) {
16 var ret;
17 var handle;
18 if (value !== undefined) {
19 ret = Promise.resolve(value)
20 ._then(afterValue, null, null, ms, undefined);
21 if (debug.cancellation() && value instanceof Promise) {
22 ret._setOnCancel(value);
23 }
24 } else {
25 ret = new Promise(INTERNAL);
26 handle = setTimeout(function() { ret._fulfill(); }, +ms);
27 if (debug.cancellation()) {
28 ret._setOnCancel(new HandleWrapper(handle));
29 }
30 ret._captureStackTrace();
31 }
32 ret._setAsyncGuaranteed();
33 return ret;
34};
35
36Promise.prototype.delay = function (ms) {
37 return delay(ms, this);
38};
39
40var afterTimeout = function (promise, message, parent) {
41 var err;
42 if (typeof message !== "string") {
43 if (message instanceof Error) {
44 err = message;
45 } else {
46 err = new TimeoutError("operation timed out");
47 }
48 } else {
49 err = new TimeoutError(message);
50 }
51 util.markAsOriginatingFromRejection(err);
52 promise._attachExtraTrace(err);
53 promise._reject(err);
54
55 if (parent != null) {
56 parent.cancel();
57 }
58};
59
60function successClear(value) {
61 clearTimeout(this.handle);
62 return value;
63}
64
65function failureClear(reason) {
66 clearTimeout(this.handle);
67 throw reason;
68}
69
70Promise.prototype.timeout = function (ms, message) {
71 ms = +ms;
72 var ret, parent;
73
74 var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
75 if (ret.isPending()) {
76 afterTimeout(ret, message, parent);
77 }
78 }, ms));
79
80 if (debug.cancellation()) {
81 parent = this.then();
82 ret = parent._then(successClear, failureClear,
83 undefined, handleWrapper, undefined);
84 ret._setOnCancel(handleWrapper);
85 } else {
86 ret = this._then(successClear, failureClear,
87 undefined, handleWrapper, undefined);
88 }
89
90 return ret;
91};
92
93};