smartpromise/ts/index.ts

67 lines
1.4 KiB
TypeScript
Raw Normal View History

2017-01-17 14:28:28 +00:00
import 'typings-global'
2017-07-06 12:10:18 +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> {
2017-07-06 12:10:18 +00:00
(value?: T | Promise<T>): void
2017-01-17 14:28:28 +00:00
}
export interface IReject {
2017-07-06 12:10:18 +00:00
(reason?: any): void
2017-01-17 14:28:28 +00:00
}
export type TDeferredStatus = 'pending' | 'fulfilled' | 'rejected'
2017-01-17 14:28:28 +00:00
export class Deferred<T> {
2017-07-06 12:10:18 +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) => {
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>() => {
2017-07-06 12:10:18 +00:00
return new Deferred<T>()
2017-01-17 14:28:28 +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> => {
2017-07-06 12:10:18 +00:00
return Promise.resolve(value)
2017-01-20 23:45:11 +00:00
}
/**
* Creates a new rejected promise for the provided reason.
*/
2017-01-20 23:45:11 +00:00
export let rejectedPromise = (err) => {
2017-07-06 12:10:18 +00:00
return Promise.reject(err)
2017-01-20 23:45:11 +00:00
}
2017-01-28 15:37:54 +00:00
2017-07-06 12:10:18 +00:00
export let promisify = util.promisify
2017-07-06 12:55:42 +00:00
// polyfill
if (!promisify) {
promisify = require('util.promisify')
}
2017-07-06 12:10:18 +00:00
export let map = async <T> (inputArg: T[],functionArg) => {
let promisifedFunction = promisify(functionArg)
let promiseArray: Promise<any>[] = []
let resultArray = []
for (let item of inputArg) {
let promise: Promise<any> = promisifedFunction(item)
promiseArray.push(promise)
promise.then(x => {
resultArray.push(x)
})
}
await Promise.all(promiseArray)
return resultArray
}