2018-03-16 09:24:12 +00:00
|
|
|
import * as util from 'util';
|
2017-01-28 15:37:54 +00:00
|
|
|
|
2017-01-17 14:28:28 +00:00
|
|
|
export interface IResolve<T> {
|
2018-03-16 09:24:12 +00:00
|
|
|
(value?: T | Promise<T>): void;
|
2017-01-17 14:28:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface IReject {
|
2018-03-16 09:24:12 +00:00
|
|
|
(reason?: any): void;
|
2017-01-17 14:28:28 +00:00
|
|
|
}
|
|
|
|
|
2018-03-16 09:24:12 +00:00
|
|
|
export type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected';
|
2017-07-27 16:17:37 +00:00
|
|
|
|
2017-01-17 14:28:28 +00:00
|
|
|
export class Deferred<T> {
|
2018-03-16 09:24:12 +00:00
|
|
|
promise: Promise<T>;
|
|
|
|
resolve: IResolve<T>;
|
|
|
|
reject: IReject;
|
|
|
|
status: TDeferredStatus;
|
|
|
|
constructor() {
|
2017-07-06 12:10:18 +00:00
|
|
|
this.promise = new Promise<T>((resolve, reject) => {
|
2018-03-16 09:24:12 +00:00
|
|
|
this.resolve = resolve;
|
|
|
|
this.reject = reject;
|
|
|
|
this.status = 'pending';
|
|
|
|
});
|
2017-07-06 12:10:18 +00:00
|
|
|
}
|
2017-01-17 14:28:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export let defer = <T>() => {
|
2018-03-16 09:24:12 +00:00
|
|
|
return new Deferred<T>();
|
|
|
|
};
|
2017-01-17 14:28:28 +00:00
|
|
|
|
2017-01-20 20:58:53 +00:00
|
|
|
/**
|
|
|
|
* Creates a new resolved promise for the provided value.
|
|
|
|
*/
|
2017-01-20 23:45:11 +00:00
|
|
|
export let resolvedPromise = <T>(value?: T): Promise<T> => {
|
2018-03-16 09:24:12 +00:00
|
|
|
return Promise.resolve(value);
|
|
|
|
};
|
2017-01-20 20:58:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a new rejected promise for the provided reason.
|
|
|
|
*/
|
2018-03-16 09:24:12 +00:00
|
|
|
export let rejectedPromise = err => {
|
|
|
|
return Promise.reject(err);
|
|
|
|
};
|
2017-01-28 15:37:54 +00:00
|
|
|
|
2018-03-16 09:24:12 +00:00
|
|
|
export let promisify = util.promisify;
|
2017-07-06 12:55:42 +00:00
|
|
|
|
|
|
|
// polyfill
|
|
|
|
if (!promisify) {
|
2018-03-16 09:24:12 +00:00
|
|
|
promisify = require('util.promisify');
|
2017-07-06 12:55:42 +00:00
|
|
|
}
|
2018-03-16 09:24:12 +00:00
|
|
|
export let map = async <T>(inputArg: T[], functionArg) => {
|
|
|
|
let promisifedFunction = promisify(functionArg);
|
|
|
|
let promiseArray: Promise<any>[] = [];
|
|
|
|
let resultArray = [];
|
2017-07-06 12:10:18 +00:00
|
|
|
for (let item of inputArg) {
|
2018-03-16 09:24:12 +00:00
|
|
|
let promise: Promise<any> = promisifedFunction(item);
|
|
|
|
promiseArray.push(promise);
|
2017-07-06 12:10:18 +00:00
|
|
|
promise.then(x => {
|
2018-03-16 09:24:12 +00:00
|
|
|
resultArray.push(x);
|
|
|
|
});
|
2017-07-06 12:10:18 +00:00
|
|
|
}
|
2018-03-16 09:24:12 +00:00
|
|
|
await Promise.all(promiseArray);
|
|
|
|
return resultArray;
|
|
|
|
};
|