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