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

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

26 回复

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

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

请问楼主解决了吗 我也遇到这个问题了 就是判断函数是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还是一个一般的函数

@1400330227 您也遇到这个问题了?

回到顶部