异步函数返回promise,可不执行难以判断。 Reflect对象对此好像然并卵!各位大大有黑科技的高招??
Promise.resolve
function isAsync(fn) { return fn.constructor.name === 'AsyncFunction'; }
@justjavac 感谢大大的回复! 但这方法没办法判断返回promise的函数啊,如:
const sleep = ms => new Promise(resolve => { setTimeout(resolve, ms); });
@magicdawn 感谢回复 我看了一遍文档,并试了一下,Promise.resolve直接处理函数没用啊!! 你是怎么做的?
@xinggsf 这个是普通函数,不是异步函数。是返回 Promise 的普通函数。
你想实现的是:如何判断一个函数的返回值是不是 Promise?
@justjavac 是啊 异步函数不过是语法糖,返回的也是promise
@xinggsf 如果是这样呢?
function fn(p) { if (p > 0) { return p; } else { return new Promise ..... } }
看源码
@AnzerWall 像我上面的例子,看源码也分析不出来,只有执行时才知道。
JS 是弱类型的,返回值你是没法判断出来的。
这个问题属于 X-Y 问题了,还是提出你最原始的需求吧
@atian25 万一最初需求是“我想普通函数直接调用,异步函数用 await 调用”,那就尴尬了
@justjavac 所以咯,需求不清晰的情况下,讨论没啥意义
@atian25 @justjavac 运行之后返回 promise 的函数怎么可能在不运行的情况下判断出来。。。不可能的。
@atian25 同意这说法
最近GO看多了
function isAsyncFunction(fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; }
你想要的应该是这个吧
co里面的代码,我用过效果挺好,async你可以用上面方法判断,但其实最终也是转换成promise
function isPromise(obj) { return 'function' == typeof obj.then; } function isGenerator(obj) { return 'function' == typeof obj.next && 'function' == typeof obj.throw; } function isGeneratorFunction(obj) { var constructor = obj.constructor; if (!constructor) return false; if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true; return isGenerator(constructor.prototype); }
来自酷炫的 CNodeMD
@zy445566 @ta7sudan 谢谢帮忙! ta7sudan, 前提是不执行函数哦
toString然后分析函数代码
请问楼主解决了吗 我也遇到这个问题了 就是判断函数是return 个promise 还是一个普通函数
对于调用方来说,你不告诉我结果类型,也不写(ts)返回类型签名,更不写备注,我管你是什么类型,直接打回去。 面向靠猜接口开发?
不跑起来怎么知道呢
onClick = () => { // 模拟一个接口 return new Promise(resolve => {
setTimeout(() => { resolve(4); }, 4000); }).then((res) => { console.log(res, '业务代码'); });
}
在其他组件判断这个onClick方法是否return个promise
用typeof this.props.onClick().then 这种方法会执行onclick 这个方法 但是不执行的前提如何判断这个onclick返回个promise还是一个一般的函数
@dengnan123
// 模拟一个接口 return new Promise(resolve => { setTimeout(() => { resolve(4); }, 4000); }).then((res) => { console.log(res, '业务代码'); }); } 在其他组件判断这个onClick方法是否return个promise 用typeof this.props.onClick().then 这种方法会执行onclick 这个方法 但是不执行的前提如何判断这个onclick返回个promise还是一个一般的函数
@justjavac 我也想知道
@1400330227 您也遇到这个问题了?
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
Promise.resolve
@justjavac 感谢大大的回复! 但这方法没办法判断返回promise的函数啊,如:
@magicdawn 感谢回复 我看了一遍文档,并试了一下,Promise.resolve直接处理函数没用啊!! 你是怎么做的?
@xinggsf 这个是普通函数,不是异步函数。是返回 Promise 的普通函数。
你想实现的是:如何判断一个函数的返回值是不是 Promise?
@justjavac 是啊 异步函数不过是语法糖,返回的也是promise
@xinggsf 如果是这样呢?
看源码
@AnzerWall 像我上面的例子,看源码也分析不出来,只有执行时才知道。
JS 是弱类型的,返回值你是没法判断出来的。
这个问题属于 X-Y 问题了,还是提出你最原始的需求吧
@atian25 万一最初需求是“我想普通函数直接调用,异步函数用 await 调用”,那就尴尬了
@justjavac 所以咯,需求不清晰的情况下,讨论没啥意义
@atian25 @justjavac 运行之后返回 promise 的函数怎么可能在不运行的情况下判断出来。。。不可能的。
@atian25 同意这说法
最近GO看多了
你想要的应该是这个吧
co里面的代码,我用过效果挺好,async你可以用上面方法判断,但其实最终也是转换成promise
来自酷炫的 CNodeMD
@zy445566 @ta7sudan 谢谢帮忙! ta7sudan, 前提是不执行函数哦
toString然后分析函数代码
请问楼主解决了吗 我也遇到这个问题了 就是判断函数是return 个promise 还是一个普通函数
对于调用方来说,你不告诉我结果类型,也不写(ts)返回类型签名,更不写备注,我管你是什么类型,直接打回去。 面向靠猜接口开发?
不跑起来怎么知道呢
onClick = () => { // 模拟一个接口 return new Promise(resolve => {
}
在其他组件判断这个onClick方法是否return个promise
用typeof this.props.onClick().then 这种方法会执行onclick 这个方法 但是不执行的前提如何判断这个onclick返回个promise还是一个一般的函数
@dengnan123
@justjavac 我也想知道
@1400330227 您也遇到这个问题了?