105 lines
3 KiB
JavaScript
105 lines
3 KiB
JavaScript
define("dojo/promise/instrumentation", [
|
|
"./tracer",
|
|
"../has",
|
|
"../_base/lang",
|
|
"../_base/array"
|
|
], function(tracer, has, lang, arrayUtil){
|
|
function logError(error, rejection, deferred){
|
|
var stack = "";
|
|
if(error && error.stack){
|
|
stack += error.stack;
|
|
}
|
|
if(rejection && rejection.stack){
|
|
stack += "\n ----------------------------------------\n rejected" + rejection.stack.split("\n").slice(1).join("\n").replace(/^\s+/, " ");
|
|
}
|
|
if(deferred && deferred.stack){
|
|
stack += "\n ----------------------------------------\n" + deferred.stack;
|
|
}
|
|
console.error(error, stack);
|
|
}
|
|
|
|
function reportRejections(error, handled, rejection, deferred){
|
|
if(!handled){
|
|
logError(error, rejection, deferred);
|
|
}
|
|
}
|
|
|
|
var errors = [];
|
|
var activeTimeout = false;
|
|
var unhandledWait = 1000;
|
|
function trackUnhandledRejections(error, handled, rejection, deferred){
|
|
if(handled){
|
|
arrayUtil.some(errors, function(obj, ix){
|
|
if(obj.error === error){
|
|
errors.splice(ix, 1);
|
|
return true;
|
|
}
|
|
});
|
|
}else if(!arrayUtil.some(errors, function(obj){ return obj.error === error; })){
|
|
errors.push({
|
|
error: error,
|
|
rejection: rejection,
|
|
deferred: deferred,
|
|
timestamp: new Date().getTime()
|
|
});
|
|
}
|
|
|
|
if(!activeTimeout){
|
|
activeTimeout = setTimeout(logRejected, unhandledWait);
|
|
}
|
|
}
|
|
|
|
function logRejected(){
|
|
var now = new Date().getTime();
|
|
var reportBefore = now - unhandledWait;
|
|
errors = arrayUtil.filter(errors, function(obj){
|
|
if(obj.timestamp < reportBefore){
|
|
logError(obj.error, obj.rejection, obj.deferred);
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
|
|
if(errors.length){
|
|
activeTimeout = setTimeout(logRejected, errors[0].timestamp + unhandledWait - now);
|
|
}else{
|
|
activeTimeout = false;
|
|
}
|
|
}
|
|
|
|
return function(Deferred){
|
|
// summary:
|
|
// Initialize instrumentation for the Deferred class.
|
|
// description:
|
|
// Initialize instrumentation for the Deferred class.
|
|
// Done automatically by `dojo/Deferred` if the
|
|
// `deferredInstrumentation` and `useDeferredInstrumentation`
|
|
// config options are set.
|
|
//
|
|
// Sets up `dojo/promise/tracer` to log to the console.
|
|
//
|
|
// Sets up instrumentation of rejected deferreds so unhandled
|
|
// errors are logged to the console.
|
|
|
|
var usage = has("config-useDeferredInstrumentation");
|
|
if(usage){
|
|
tracer.on("resolved", lang.hitch(console, "log", "resolved"));
|
|
tracer.on("rejected", lang.hitch(console, "log", "rejected"));
|
|
tracer.on("progress", lang.hitch(console, "log", "progress"));
|
|
|
|
var args = [];
|
|
if(typeof usage === "string"){
|
|
args = usage.split(",");
|
|
usage = args.shift();
|
|
}
|
|
if(usage === "report-rejections"){
|
|
Deferred.instrumentRejected = reportRejections;
|
|
}else if(usage === "report-unhandled-rejections" || usage === true || usage === 1){
|
|
Deferred.instrumentRejected = trackUnhandledRejections;
|
|
unhandledWait = parseInt(args[0], 10) || unhandledWait;
|
|
}else{
|
|
throw new Error("Unsupported instrumentation usage <" + usage + ">");
|
|
}
|
|
}
|
|
};
|
|
});
|