86 lines
2.3 KiB
JavaScript
86 lines
2.3 KiB
JavaScript
|
define("dojo/promise/tracer", [
|
||
|
"../_base/lang",
|
||
|
"./Promise",
|
||
|
"../Evented"
|
||
|
], function(lang, Promise, Evented){
|
||
|
"use strict";
|
||
|
|
||
|
// module:
|
||
|
// dojo/promise/tracer
|
||
|
|
||
|
/*=====
|
||
|
return {
|
||
|
// summary:
|
||
|
// Trace promise fulfillment.
|
||
|
// description:
|
||
|
// Trace promise fulfillment. Calling `.trace()` or `.traceError()` on a
|
||
|
// promise enables tracing. Will emit `resolved`, `rejected` or `progress`
|
||
|
// events.
|
||
|
|
||
|
on: function(type, listener){
|
||
|
// summary:
|
||
|
// Subscribe to traces.
|
||
|
// description:
|
||
|
// See `dojo/Evented#on()`.
|
||
|
// type: String
|
||
|
// `resolved`, `rejected`, or `progress`
|
||
|
// listener: Function
|
||
|
// The listener is passed the traced value and any arguments
|
||
|
// that were used with the `.trace()` call.
|
||
|
}
|
||
|
};
|
||
|
=====*/
|
||
|
|
||
|
var evented = new Evented;
|
||
|
var emit = evented.emit;
|
||
|
evented.emit = null;
|
||
|
// Emit events asynchronously since they should not change the promise state.
|
||
|
function emitAsync(args){
|
||
|
setTimeout(function(){
|
||
|
emit.apply(evented, args);
|
||
|
}, 0);
|
||
|
}
|
||
|
|
||
|
Promise.prototype.trace = function(){
|
||
|
// summary:
|
||
|
// Trace the promise.
|
||
|
// description:
|
||
|
// Tracing allows you to transparently log progress,
|
||
|
// resolution and rejection of promises, without affecting the
|
||
|
// promise itself. Any arguments passed to `trace()` are
|
||
|
// emitted in trace events. See `dojo/promise/tracer` on how
|
||
|
// to handle traces.
|
||
|
// returns: dojo/promise/Promise
|
||
|
// The promise instance `trace()` is called on.
|
||
|
|
||
|
var args = lang._toArray(arguments);
|
||
|
this.then(
|
||
|
function(value){ emitAsync(["resolved", value].concat(args)); },
|
||
|
function(error){ emitAsync(["rejected", error].concat(args)); },
|
||
|
function(update){ emitAsync(["progress", update].concat(args)); }
|
||
|
);
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
Promise.prototype.traceRejected = function(){
|
||
|
// summary:
|
||
|
// Trace rejection of the promise.
|
||
|
// description:
|
||
|
// Tracing allows you to transparently log progress,
|
||
|
// resolution and rejection of promises, without affecting the
|
||
|
// promise itself. Any arguments passed to `trace()` are
|
||
|
// emitted in trace events. See `dojo/promise/tracer` on how
|
||
|
// to handle traces.
|
||
|
// returns: dojo/promise/Promise
|
||
|
// The promise instance `traceRejected()` is called on.
|
||
|
|
||
|
var args = lang._toArray(arguments);
|
||
|
this.otherwise(function(error){
|
||
|
emitAsync(["rejected", error].concat(args));
|
||
|
});
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
return evented;
|
||
|
});
|