]>
Commit | Line | Data |
---|---|---|
f0cfe83e AD |
1 | define("dojo/promise/instrumentation", [ |
2 | "./tracer", | |
3 | "../has", | |
4 | "../_base/lang", | |
5 | "../_base/array" | |
6 | ], function(tracer, has, lang, arrayUtil){ | |
7 | function logError(error, rejection, deferred){ | |
8 | var stack = ""; | |
9 | if(error && error.stack){ | |
10 | stack += error.stack; | |
11 | } | |
12 | if(rejection && rejection.stack){ | |
13 | stack += "\n ----------------------------------------\n rejected" + rejection.stack.split("\n").slice(1).join("\n").replace(/^\s+/, " "); | |
14 | } | |
15 | if(deferred && deferred.stack){ | |
16 | stack += "\n ----------------------------------------\n" + deferred.stack; | |
17 | } | |
18 | console.error(error, stack); | |
19 | } | |
20 | ||
21 | function reportRejections(error, handled, rejection, deferred){ | |
22 | if(!handled){ | |
23 | logError(error, rejection, deferred); | |
24 | } | |
25 | } | |
26 | ||
27 | var errors = []; | |
28 | var activeTimeout = false; | |
29 | var unhandledWait = 1000; | |
30 | function trackUnhandledRejections(error, handled, rejection, deferred){ | |
31 | if(handled){ | |
32 | arrayUtil.some(errors, function(obj, ix){ | |
33 | if(obj.error === error){ | |
34 | errors.splice(ix, 1); | |
35 | return true; | |
36 | } | |
37 | }); | |
38 | }else if(!arrayUtil.some(errors, function(obj){ return obj.error === error; })){ | |
39 | errors.push({ | |
40 | error: error, | |
41 | rejection: rejection, | |
42 | deferred: deferred, | |
43 | timestamp: new Date().getTime() | |
44 | }); | |
45 | } | |
46 | ||
47 | if(!activeTimeout){ | |
48 | activeTimeout = setTimeout(logRejected, unhandledWait); | |
49 | } | |
50 | } | |
51 | ||
52 | function logRejected(){ | |
53 | var now = new Date().getTime(); | |
54 | var reportBefore = now - unhandledWait; | |
55 | errors = arrayUtil.filter(errors, function(obj){ | |
56 | if(obj.timestamp < reportBefore){ | |
57 | logError(obj.error, obj.rejection, obj.deferred); | |
58 | return false; | |
59 | } | |
60 | return true; | |
61 | }); | |
62 | ||
63 | if(errors.length){ | |
64 | activeTimeout = setTimeout(logRejected, errors[0].timestamp + unhandledWait - now); | |
65 | }else{ | |
66 | activeTimeout = false; | |
67 | } | |
68 | } | |
69 | ||
70 | return function(Deferred){ | |
71 | // summary: | |
72 | // Initialize instrumentation for the Deferred class. | |
73 | // description: | |
74 | // Initialize instrumentation for the Deferred class. | |
75 | // Done automatically by `dojo/Deferred` if the | |
76 | // `deferredInstrumentation` and `useDeferredInstrumentation` | |
77 | // config options are set. | |
78 | // | |
79 | // Sets up `dojo/promise/tracer` to log to the console. | |
80 | // | |
81 | // Sets up instrumentation of rejected deferreds so unhandled | |
82 | // errors are logged to the console. | |
83 | ||
84 | var usage = has("config-useDeferredInstrumentation"); | |
85 | if(usage){ | |
86 | tracer.on("resolved", lang.hitch(console, "log", "resolved")); | |
87 | tracer.on("rejected", lang.hitch(console, "log", "rejected")); | |
88 | tracer.on("progress", lang.hitch(console, "log", "progress")); | |
89 | ||
90 | var args = []; | |
91 | if(typeof usage === "string"){ | |
92 | args = usage.split(","); | |
93 | usage = args.shift(); | |
94 | } | |
95 | if(usage === "report-rejections"){ | |
96 | Deferred.instrumentRejected = reportRejections; | |
97 | }else if(usage === "report-unhandled-rejections" || usage === true || usage === 1){ | |
98 | Deferred.instrumentRejected = trackUnhandledRejections; | |
99 | unhandledWait = parseInt(args[0], 10) || unhandledWait; | |
100 | }else{ | |
101 | throw new Error("Unsupported instrumentation usage <" + usage + ">"); | |
102 | } | |
103 | } | |
104 | }; | |
105 | }); |