import isfun from './isfun.mjs'
import pmHook from './pmHook.mjs'
/**
* 掛勾非同步(Promise)函數,可監聽或修改Promise的reject輸出數據
*
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/pmHookReject.test.mjs Github}
* @memberOf wsemi
* @param {Function} fun 輸入非同步Promise函數
* @param {Function} [cb=() => {}] 輸入回調函數,預設()={},cb函數之輸入為監聽reject到的資訊數據。若想於cb函數修改reject數據,則由cb函數的輸入修改完回傳即可。例如收到reject的msg為'aaa',將msg='bbb'再return msg即可
* @returns {Promise} 回傳為Promise,resolve為回傳成功結果,reject為回傳失敗訊息
* @example
*
* async function topAsync() {
*
* async function test1() {
* return new Promise((resolve, reject) => {
* let ms = []
*
* let pm = function (v1, v2) {
* return new Promise(function(resolve, reject) {
* ms.push(`reject: v1=${v1}, v2=${v2}`)
* reject(`reject: v1=${v1}, v2=${v2}`)
* })
* }
*
* let pmr = pmHookReject(pm, (msg) => {
* console.log('cb: ' + msg)
* msg = '[modify catch]' + msg
* ms.push('cb: ' + msg)
* return msg
* })
*
* pmr('t1', 12.3)
* .then(function(msg) {
* console.log('t1 then', msg)
* ms.push('t1 then: ' + msg)
* })
* .catch(function(msg) {
* console.log('t1 catch', msg)
* ms.push('t1 catch: ' + msg)
* })
* .finally(function() {
* resolve(ms)
* })
*
* })
* }
* console.log('test1')
* let r1 = await test1()
* console.log(JSON.stringify(r1))
* // test1
* // cb: reject: v1=t1, v2=12.3
* // t1 catch [modify catch]reject: v1=t1, v2=12.3
* // ["reject: v1=t1, v2=12.3","cb: [modify catch]reject: v1=t1, v2=12.3","t1 catch: [modify catch]reject: v1=t1, v2=12.3"]
*
* async function test2() {
* return new Promise((resolve, reject) => {
* let ms = []
*
* let pm = function () {
* return new Promise(function(resolve, reject) {
* ms.push(`reject`)
* reject(`reject`)
* })
* }
*
* let pmr = pmHookReject(pm, (msg) => {
* console.log('cb: ' + msg)
* msg = '[modify catch]' + msg
* ms.push('cb: ' + msg)
* return msg
* })
*
* pmr() //測試無輸入
* .then(function(msg) {
* console.log('t1 then', msg)
* ms.push('t1 then: ' + msg)
* })
* .catch(function(msg) {
* console.log('t1 catch', msg)
* ms.push('t1 catch: ' + msg)
* })
* .finally(function() {
* resolve(ms)
* })
*
* })
* }
* console.log('test2')
* let r2 = await test2()
* console.log(JSON.stringify(r2))
* // test2
* // cb: reject
* // t1 catch [modify catch]reject
* // ["reject","cb: [modify catch]reject","t1 catch: [modify catch]reject"]
*
* }
* topAsync().catch(() => {})
*
*/
function pmHookReject(fun, cb = () => {}) {
//check
if (!isfun(fun)) {
return null
}
if (!isfun(cb)) {
cb = () => {}
}
//pmHook
return pmHook(fun, (msg) => {
if (msg.mode === 'afterCatch') {
return cb(msg.data)
}
})
}
export default pmHookReject