diff options
Diffstat (limited to 'dom/browser-element/mochitest/async.js')
-rw-r--r-- | dom/browser-element/mochitest/async.js | 78 |
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)); |