UNPKG

wsemi

Version:

A support package for web developer.

138 lines (127 loc) 3.76 kB
import get from 'lodash/get' import genPm from './genPm.mjs' import ispm from './ispm.mjs' import isbol from './isbol.mjs' /** * 將pmConvertResolve回傳結果轉回原本Promise的resolve與reject * * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/pmInvResolve.test.mjs Github} * @memberOf wsemi * @param {Promise} pm 輸入pmConvertResolve所轉出的Promise,其皆使用resolve回傳物件資料 * @param {Object} [opt={}] 輸入設定物件,預設{} * @param {Boolean} [opt.thenExtractData=false] 輸入是否於then提取data欄位值布林值,主要用於轉換axios取得之pm,預設false * @returns {Promise} 回傳Promise,皆使用resolve回傳物件資料,物件欄位有state與msg,state可有success、error與cancelled。cancelled代表reject回傳{ reason: 'cancelled' } * @example * * async function test1() { * let pmInp = genPm() * pmInp.resolve({ * state: 'success', * msg: 'abc', * }) * let pmOut = pmInvResolve(pmInp) * await pmOut * .then((res) => { * console.log('test1 then', res) * // test1 then abc * }) * .catch((res) => { * console.log('test1 catch', res) * }) * } * test1() * * async function test2() { * let pmInp = genPm() * pmInp.resolve({ * state: 'error', * msg: 'abc', * }) * let pmOut = pmInvResolve(pmInp) * await pmOut * .then((res) => { * console.log('test2 then', res) * }) * .catch((res) => { * console.log('test2 catch', res) * // test2 catch abc * }) * } * test2() * * async function test3() { * let pmInp = genPm() * pmInp.resolve({ * state: 'cancelled', * msg: 'abc', * }) * let pmOut = pmInvResolve(pmInp) * await pmOut * .then((res) => { * console.log('test3 then', res) * }) * .catch((res) => { * console.log('test3 catch', res) * // test3 catch { reason: 'cancelled' } * }) * } * test3() * * async function test4() { * let pmInp = genPm() * pmInp.resolve({ * data: { * state: 'success', * msg: 'abc', * }, * }) * let pmOut = pmInvResolve(pmInp, { thenExtractData: true }) * await pmOut * .then((res) => { * console.log('test4 then', res) * // test4 then abc * }) * .catch((res) => { * console.log('test4 catch', res) * }) * } * test4() * */ function pmInvResolve(pm, opt = {}) { //check if (!ispm(pm)) { throw new Error(`pm is not a promise`) } //thenExtractData let thenExtractData = get(opt, 'thenExtractData') if (!isbol(thenExtractData)) { thenExtractData = false } let _pm = genPm() pm .then((r) => { //thenExtractData if (thenExtractData) { r = get(r, 'data') } //state, msg let state = get(r, 'state', '') let msg = get(r, 'msg', {}) //resolve, reject if (state === 'success') { _pm.resolve(msg) } else if (state === 'cancelled') { _pm.reject({ reason: 'cancelled' }) } else { _pm.reject(msg) } }) .catch((err) => { _pm.reject(err) }) return _pm } export default pmInvResolve