summaryrefslogtreecommitdiffstats
path: root/extensions/fastdom-promised.js
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/fastdom-promised.js')
-rw-r--r--extensions/fastdom-promised.js77
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