[483] | 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 | }); |
---|