Blame dom/browser-element/mochitest/async.js

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
Packit f0b94e
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
/*
Packit f0b94e
 * This is an approximate implementation of ES7's async-await pattern.
Packit f0b94e
 * see: https://github.com/tc39/ecmascript-asyncawait
Packit f0b94e
 *
Packit f0b94e
 * It allows for simple creation of async function and "tasks".
Packit f0b94e
 *
Packit f0b94e
 * For example:
Packit f0b94e
 *
Packit f0b94e
 *  var myThinger = {
Packit f0b94e
 *    doAsynThing: async(function*(url){
Packit f0b94e
 *      var result = yield fetch(url);
Packit f0b94e
 *      return process(result);
Packit f0b94e
 *    });
Packit f0b94e
 * }
Packit f0b94e
 *
Packit f0b94e
 * And Task-like things can be created as follows:
Packit f0b94e
 *
Packit f0b94e
 * var myTask = async(function*{
Packit f0b94e
 *   var result = yield fetch(url);
Packit f0b94e
 *   return result;
Packit f0b94e
 * });
Packit f0b94e
 * //returns a promise
Packit f0b94e
 *
Packit f0b94e
 * myTask().then(doSomethingElse);
Packit f0b94e
 *
Packit f0b94e
 */
Packit f0b94e
Packit f0b94e
(function(exports) {
Packit f0b94e
  "use strict";
Packit f0b94e
  function async(func, self) {
Packit f0b94e
    return function asyncFunction() {
Packit f0b94e
      const functionArgs = Array.from(arguments);
Packit f0b94e
      return new Promise(function(resolve, reject) {
Packit f0b94e
        var gen;
Packit f0b94e
        if (typeof func !== "function") {
Packit f0b94e
          reject(new TypeError("Expected a Function."));
Packit f0b94e
        }
Packit f0b94e
        //not a generator, wrap it.
Packit f0b94e
        if (func.constructor.name !== "GeneratorFunction") {
Packit f0b94e
          gen = (function*() {
Packit f0b94e
            return func.apply(self, functionArgs);
Packit f0b94e
          }());
Packit f0b94e
        } else {
Packit f0b94e
          gen = func.apply(self, functionArgs);
Packit f0b94e
        }
Packit f0b94e
        try {
Packit f0b94e
          step(gen.next(undefined));
Packit f0b94e
        } catch (err) {
Packit f0b94e
          reject(err);
Packit f0b94e
        }
Packit f0b94e
Packit f0b94e
        function step({value, done}) {
Packit f0b94e
          if (done) {
Packit f0b94e
            return resolve(value);
Packit f0b94e
          }
Packit f0b94e
          if (value instanceof Promise) {
Packit f0b94e
            return value.then(
Packit f0b94e
              result => step(gen.next(result)),
Packit f0b94e
              error => {
Packit f0b94e
                try {
Packit f0b94e
                  step(gen.throw(error));
Packit f0b94e
                } catch (err) {
Packit f0b94e
                  throw err;
Packit f0b94e
                }
Packit f0b94e
              }
Packit f0b94e
            ).catch(err => reject(err));
Packit f0b94e
          }
Packit f0b94e
          step(gen.next(value));
Packit f0b94e
        }
Packit f0b94e
      });
Packit f0b94e
    };
Packit f0b94e
  }
Packit f0b94e
  exports.async = async;
Packit f0b94e
}(this || self));