diff options
Diffstat (limited to 'extensions/fastdom-promised.js')
-rw-r--r-- | extensions/fastdom-promised.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/extensions/fastdom-promised.js b/extensions/fastdom-promised.js new file mode 100644 index 0000000..e002072 --- /dev/null +++ b/extensions/fastdom-promised.js @@ -0,0 +1,77 @@ +!(function() { + +/** + * Wraps fastdom in a Promise API + * for improved control-flow. + * + * @example + * + * // returning a result + * fastdom.measure(() => el.clientWidth) + * .then(result => ...); + * + * // returning promises from tasks + * fastdom.measure(() => { + * var w = el1.clientWidth; + * return fastdom.mutate(() => el2.style.width = w + 'px'); + * }).then(() => console.log('all done')); + * + * // clearing pending tasks + * var promise = fastdom.measure(...) + * fastdom.clear(promise); + * + * @type {Object} + */ +var exports = { + initialize: function() { + this._tasks = new Map(); + }, + + mutate: function(fn, ctx) { + return create(this, 'mutate', fn, ctx); + }, + + measure: function(fn, ctx) { + return create(this, 'measure', fn, ctx); + }, + + clear: function(promise) { + var tasks = this._tasks; + var task = tasks.get(promise); + this.fastdom.clear(task); + tasks.delete(task); + } +}; + +/** + * Create a fastdom task wrapped in + * a 'cancellable' Promise. + * + * @param {FastDom} fastdom + * @param {String} type - 'measure'|'muatate' + * @param {Function} fn + * @return {Promise} + */ +function create(promised, type, fn, ctx) { + var tasks = promised._tasks; + var fastdom = promised.fastdom; + var task; + + var promise = new Promise(function(resolve, reject) { + task = fastdom[type](function() { + tasks.delete(promise); + try { resolve(fn()); } + catch (e) { reject(e); } + }, ctx); + }); + + tasks.set(promise, task); + return promise; +} + +// Expose to CJS, AMD or global +if ((typeof define)[0] == 'f') define(function() { return exports; }); +else if ((typeof module)[0] == 'o') module.exports = exports; +else window.fastdomPromised = exports; + +})();
\ No newline at end of file |