【问题标题】:function wrapping promise get undefined typeof then [closed]函数包装承诺得到未定义的typeof然后[关闭]
【发布时间】:2018-12-23 04:04:12
【问题描述】:

我传递了一个fn 作为参数,以应用于我的树遍历函数中的每个节点。我正在尝试使用typeof fn.then === 'function' 来检查fn 是否是一个承诺(如果是,我将需要使用here 所示的“有希望”的遍历版本)。作为fn的定义,如果我将一个新的promise包装到一个接受node参数的函数中,上面的检查返回undefined而不是function

<script>
let promise1 = new Promise((resolve, reject) => {
    let y = 2;
  resolve(y);
});

let promise2 = function(y){
  return new Promise((resolve, reject) => {
    resolve(y);
  });
};

alert ('typeof promise1.then: ' + typeof promise1.then + '\ntypeof promise2.then: '  + typeof promise2.then);
</script>

【问题讨论】:

  • "Demo code is here"应该是minimal reproducible example而不是外部资源的链接
  • @Andreas -- 通常我使用 plunker 作为演示代码,我看到其他人在这里也这样做。如果您可以简单地看一下,演示代码本身是完整且可验证的。我不知道为什么我在发布后 5 秒内得到一个“-1”;我觉得你很不负责任。
  • 当然你需要检查函数的返回值是否是一个promise,而不是检查函数是否是一个promise。
  • 我认为您必须调用该函数并查看返回值是什么。希望函数不可能有时返回承诺,有时返回其他内容。
  • 避免使用可能返回承诺的函数或反过来返回承诺的函数。为了便于阅读,您应该始终返回一种类型。例如,您可以将原本会直接返回的 Promise 包装到一个函数中。您能否提供一个更详细(但尽可能简短)的示例,如何调用这样的函数?除了使用foo instanceof Promise 更好地探测承诺之外。

标签: javascript promise


【解决方案1】:

我正在尝试检查某事是否是一个承诺;如果是,我将需要使用“有希望”的遍历版本

不要那样做。从同一个函数返回不同的类型(result 与 promise-for-result)非常令人困惑,并且在函数内部的“正常”和“有希望”版本之间动态切换也不会使您的代码更易于维护。

只需提供两个不同的函数,一个是同步的,它期望从它的回调中获得纯值,另一个是异步的,它期望它的回调返回 Promise。在那里,您只需使用 Promise.resolve(…) 将任何返回值转换为 Promise,而不是测试它是否是 Promise(或类似的东西)。

【讨论】:

  • Promise.resolve(…) 似乎是一个实用的解决方案来包装fn“无论它是否是一个承诺(或类似的东西)”,并使其成为可能。
  • 是的,这正是Promise.resolve 的目的:-)
猜你喜欢
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2016-03-21
  • 2017-03-05
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多