rpgeeganage/alls

View on GitHub
lib/index.ts

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Promise states
 *
 * @export
 * @enum {number}
 */
export enum PromiseState {
  fulfilled = 'fulfilled',
  rejected = 'rejected'
}

/**
 * Return value interface
 *
 * @export
 * @interface ReturnValue
 */
export interface ReturnValue {
  state: PromiseState;
  reason?: any;
  value?: any;
}

class Alls {
  /**
   * Creates an instance of Alls.
   * @param {Promise<any>[]} promises
   * @memberof Alls
   */
  constructor(public promises: Promise<any>[]) {}

  /**
   * Get instance of an Alls
   *
   * @static
   * @param {Promise<any>[]} promises
   * @returns {Alls}
   * @memberof Alls
   */
  static getInstance(promises: Promise<any>[]): Alls {
    return new Alls(promises);
  }

  /**
   * Process promise list
   *
   * @returns {Promise<ReturnValue[]>}
   * @memberof Alls
   */
  process(): Promise<ReturnValue[]> {
    const promisesList = this.promises.map((p) => {
      if (!p || p.toString() !== '[object Promise]') {
        return {
          state: 'fulfilled',
          value: p
        };
      }

      return p
        .then(
          (e): ReturnValue => {
            return {
              state: PromiseState.fulfilled,
              value: e
            };
          }
        )
        .catch(
          (err): ReturnValue => {
            return {
              state: PromiseState.rejected,
              reason: err
            };
          }
        );
    });

    return Promise.all(promisesList as Promise<any>[]);
  }
}

/**
 * alls processing function
 *
 * @export
 * @param {Promise<any>[]} promises
 * @returns {Promise<ReturnValue[]>}
 */
export function alls(promises: Promise<any>[]): Promise<ReturnValue[]> {
  return Alls.getInstance(promises).process();
}