【问题标题】:Handling error when using [].reduce to call several functions sequentially使用 [].reduce 顺序调用多个函数时的处理错误
【发布时间】:2018-02-24 04:17:33
【问题描述】:

我有以下代码依次运行 15 个承诺:

[func1, func2, func3, ...etc].reduce((prev, curr) =>
  prev.then(curr).catch(console.error)
, Promise.resolve())

问题是:当某个函数内部发生错误时,我的终端中会弹出以下错误:

Cannot read property 'reduce' of undefined

我已经搜索过,但找不到有同样错误的人。有解决办法吗?

谢谢。

【问题讨论】:

  • reduce 是否在其中一个函数中被调用。 reduce 中的错误不应导致原始 reduce 上出现该消息。
  • 这可能意味着func1..funcN 中的一个有另一个reduce 语句,它失败了...检查你的错误堆栈,也许也将它粘贴到这里!
  • 请发minimal reproducible example 并附上一些发生错误的简单演示函数。

标签: javascript node.js promise


【解决方案1】:

我的水晶球说 在其中一个函数中,您在作为参数接收的数组上使用 reduce,作为前一个函数的结果。

问题在于,当错误发生时,您的.catch(console.error) 会立即处理它并返回一个由undefined 履行的承诺(console.error(…) 的返回值)。然后将此结果传递给下一个函数,无论错误如何,该函数都会执行。您只需要在最后处理错误:

[func1, func2, func3, …].reduce((prev, curr) =>
  prev.then(curr)
, Promise.resolve()).catch(console.error)

【讨论】:

  • 你确定它会起作用吗?因为我不这么认为,prev 仍然是未定义的。
  • prev 从来不是undefined,它始终是一个承诺(在我的代码中以及在原始代码中)。 (我猜是这样)问题在于这是一个用undefined 实现的承诺。
  • 嗨,Bergi!其实我不是,我正在解析一个不是真正的 JSON 的 JSON 来测试它。
  • @Celo 是的,这是第一个错误。它应该被记录下来,并且链承诺正在解析为undefined。然后链中的下一个函数尝试在假定的 JSON 数组上调用 .reduce,这当然不起作用,并导致您现在询问的第二条错误消息。但正如我在问题 cmets 中所说,对于任何更详细的诊断,我们需要一个完整的非工作代码示例。
  • 我明白了。实际上,我能够找出问题所在。我没有使用;,所以解释器在reduce之前连接了行...--"。
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多