【问题标题】: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 中创建动作。如果包装的函数返回一个承诺,它将被分派

标签: javascript promise


【解决方案1】:

如何判断函数是否返回 Promise

这是impossible in general,无需执行它或使用静态类型系统。

我想对同步和异步操作使用相同的界面。

解决方案不是检测函数在调用时是否会返回一个 Promise,而只是始终将其视为异步的。您可以使用Promise.resolve 来转换最终的非承诺值:

function createAction(name, action) {
    …
    Promise.resolve(action()).then(result => …);
}

【讨论】:

  • 感谢您的回答。
【解决方案2】:

Promise 是值的代理,而不是进程的代理。一个“IOU”,如果你愿意的话,它是一个运行操作产生的值。

因此,根据定义,如果不先运行会产生最终值的操作,就无法获得要测试的 Promise。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2011-08-17
    相关资源
    最近更新 更多