不执行函数~如何判断函数是异步函数还是普通函数
发布于 8 个月前 作者 xinggsf 1462 次浏览 来自 问答

异步函数返回promise,可不执行难以判断。 Reflect对象对此好像然并卵!各位大大有黑科技的高招??

19 回复
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 的函数怎么可能在不运行的情况下判断出来。。。不可能的。

JS 是弱类型的,返回值你是没法判断出来的。

@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然后分析函数代码

回到顶部