source: Dev/trunk/src/client/dojo/promise/instrumentation.js @ 529

Last change on this file since 529 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 2.9 KB
Line 
1define([
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});
Note: See TracBrowser for help on using the repository browser.