如何判断一个函数是不是在不执行函数的情况下返回 Promise?
Posted
技术标签:
【中文标题】如何判断一个函数是不是在不执行函数的情况下返回 Promise?【英文标题】:How do I tell if a function returns a Promise without executing the function?如何判断一个函数是否在不执行函数的情况下返回 Promise? 【发布时间】:2016-08-28 08:40:54 【问题描述】:要测试一个对象是否是 Promise,只需检查该对象是否具有 then()
属性
但是如果函数没有执行,那么对象还没有产生怎么办。有没有办法测试?还是伪造执行?那么如何处理执行中可能出现的错误呢?
我正在尝试编写一个辅助函数来在 Redux 中创建操作。我想对同步和异步操作使用相同的界面。
function createAction('SOMEACTION', (arg) => dosth(arg);
function createAction('FETCHACTION', (arg) =>fetch(arg);
我将通过检查 fetch()
是否返回一个承诺来检测异步操作。
【问题讨论】:
不,一般来说没有办法做到这一点。不过,如果您只是想处理同步错误,则可以将所有内容包装在try
中。
你为什么要这样做?
为什么你对一个函数知之甚少?如果它来自 3rd 方库,请阅读文档,如果它是您编写的函数,请写得更好——这对我来说有点 XY 问题
function()return [1, Promise.resolve()][Math.floor(Math.random()*2)];
的结果是什么?不运行它怎么知道?
我尝试编写一个包装函数来在 redux 中创建动作。如果包装的函数返回一个承诺,它将被分派
【参考方案1】:
如何判断函数是否返回 Promise
这是impossible in general,无需执行它或使用静态类型系统。
我想对同步和异步操作使用相同的界面。
解决方案不是检测函数在调用时是否会返回一个 Promise,而只是始终将其视为异步的。您可以使用Promise.resolve
来转换最终的非承诺值:
function createAction(name, action)
…
Promise.resolve(action()).then(result => …);
【讨论】:
感谢您的回答。【参考方案2】:Promise 是值的代理,而不是进程的代理。一个“IOU”,如果你愿意的话,它是一个运行操作产生的值。
因此,根据定义,如果不先运行会产生最终值的操作,就无法获得要测试的 Promise。
【讨论】:
以上是关于如何判断一个函数是不是在不执行函数的情况下返回 Promise?的主要内容,如果未能解决你的问题,请参考以下文章
如果数字不是偶数,为啥这个函数会返回“None”?如何在不使用其他条件的情况下使其返回“False”?