summaryrefslogtreecommitdiffstats
path: root/dom/browser-element/mochitest/async.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/browser-element/mochitest/async.js')
-rw-r--r--dom/browser-element/mochitest/async.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/dom/browser-element/mochitest/async.js b/dom/browser-element/mochitest/async.js
new file mode 100644
index 000000000..d0007fa09
--- /dev/null
+++ b/dom/browser-element/mochitest/async.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * This is an approximate implementation of ES7's async-await pattern.
+ * see: https://github.com/tc39/ecmascript-asyncawait
+ *
+ * It allows for simple creation of async function and "tasks".
+ *
+ * For example:
+ *
+ * var myThinger = {
+ * doAsynThing: async(function*(url){
+ * var result = yield fetch(url);
+ * return process(result);
+ * });
+ * }
+ *
+ * And Task-like things can be created as follows:
+ *
+ * var myTask = async(function*{
+ * var result = yield fetch(url);
+ * return result;
+ * });
+ * //returns a promise
+ *
+ * myTask().then(doSomethingElse);
+ *
+ */
+
+(function(exports) {
+ "use strict";
+ function async(func, self) {
+ return function asyncFunction() {
+ const functionArgs = Array.from(arguments);
+ return new Promise(function(resolve, reject) {
+ var gen;
+ if (typeof func !== "function") {
+ reject(new TypeError("Expected a Function."));
+ }
+ //not a generator, wrap it.
+ if (func.constructor.name !== "GeneratorFunction") {
+ gen = (function*() {
+ return func.apply(self, functionArgs);
+ }());
+ } else {
+ gen = func.apply(self, functionArgs);
+ }
+ try {
+ step(gen.next(undefined));
+ } catch (err) {
+ reject(err);
+ }
+
+ function step({value, done}) {
+ if (done) {
+ return resolve(value);
+ }
+ if (value instanceof Promise) {
+ return value.then(
+ result => step(gen.next(result)),
+ error => {
+ try {
+ step(gen.throw(error));
+ } catch (err) {
+ throw err;
+ }
+ }
+ ).catch(err => reject(err));
+ }
+ step(gen.next(value));
+ }
+ });
+ };
+ }
+ exports.async = async;
+}(this || self));