summaryrefslogtreecommitdiffstats
path: root/extensions/fastdom-promised.js
diff options
context:
space:
mode:
authorWilson Page <wilsonpage@me.com>2015-02-13 19:49:50 +0000
committerWilson Page <wilsonpage@me.com>2016-01-04 12:21:44 +0000
commit4ade1a6b6b14fcef9686ab9eb03e6e4951b948fc (patch)
tree1cf3226ef4b51cbd069bc01ca15343f081646657 /extensions/fastdom-promised.js
parent6c4958941d2c86cdfa6dc17a8b286399f3f71729 (diff)
downloadfastdom-origin/v1-beta.zip
fastdom-origin/v1-beta.tar.gz
fastdom-origin/v1-beta.tar.bz2
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