@beenotung/tslib
Version:
utils library in Typescript
72 lines (71 loc) • 1.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.promisify = promisify;
exports.genPromiseCallback = genPromiseCallback;
exports.runFinally = runFinally;
exports.getPromiseState = getPromiseState;
async function promisify(f, args = []) {
return new Promise((resolve, reject) => {
f(...args, (err, res) => {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
});
}
function genPromiseCallback() {
let resolve;
let reject;
const p = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
const cb = (err, res) => {
if (err) {
reject(err);
}
else {
resolve(res);
}
};
return Object.assign(cb, { promise: p });
}
async function runFinally(p, cb) {
try {
return await p;
}
catch (e) {
return Promise.reject(e);
}
finally {
cb();
}
}
/**
* @description only supported in NodeJS runtime, will throw error in browser runtime
*/
function getPromiseState(p) {
if (typeof require === 'undefined') {
throw new Error('only supported in NodeJS runtime');
}
// eslint-disable-next-line @typescript-eslint/no-var-requires
const util = require('util');
// Promise { <pending> }
// Promise { 'the value' }
// Promise { <rejected> 'the reason' }
let text = util.inspect(p);
if (!(text.startsWith('Promise {') && text.endsWith(' }'))) {
throw new Error('not a promise');
}
text = text.slice('Promise {'.length, -' }'.length).trim();
if (text === '<pending>') {
return 'pending';
}
if (text.startsWith('<rejected>')) {
return 'rejected';
}
return 'fulfilled';
}