如何判断一个函数是不是在不执行函数的情况下返回 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”?

在函数中,如何在不使用 ref 游标的情况下返回多个值?

如何编写一个函数,在不使用返回的情况下更改原始整数列表?

如何在不破坏遗留代码的情况下增加函数的返回值?

如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?

如何在不重新绑定 this 的情况下返回一个带有粗箭头函数的对象? [复制]