1 | define([ |
---|
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 | }); |
---|