|
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));
|