【问题标题】:Function taking unlimited number of parameters and invokes callbacks one by one Javascript [closed]函数采用无限数量的参数并一一调用回调Javascript [关闭]
【发布时间】:2022-06-15 23:25:36
【问题描述】:

所以,我必须按照一些规则重写这个代码示例:

mix(() => {
    return 0;
}, (prev) => {
    return prev + 1;
}, (prev) => {
    return prev * 2;
})

所以它把回调函数的返回值作为参数。我要做的是: 编写一个箭头函数,逐个调用回调。每个回调作为参数获取上一次回调调用的结果。第一个回调没有获取任何参数。

【问题讨论】:

  • 欢迎来到Stack Overflow!请拨打tour,访问help center 并阅读asking good questions。在做了一些研究和searching 了解 SO 的相关主题之后,自己尝试一下。如果您遇到困难,请发布您的尝试minimal reproducible example,并准确记录您卡在哪里。人们会很乐意提供帮助。
  • 你似乎想组合论据。
  • @evolutionbox:当我读到它时,这是一个组合然后立即调用的问题,这意味着组合函数实际上并不需要创建......虽然如果我不会感到惊讶这是这里没有提到的任务的一部分。

标签: javascript


【解决方案1】:

您可以使用rest parameters (...) 接受不定数量的回调,然后您可以使用Array.prototype.reduce 使用前面回调返回的值调用回调。

const mix = (...cbs) => cbs.reduce((res, cb) => cb(res), undefined);

const result = mix(
  () => 0,
  (prev) => prev + 1,
  (prev) => prev * 2
);

console.log(result);

如果使用undefined 调用第一个函数有问题,那么您可以执行以下操作:

const mix = (...cbs) => cbs.reduce((res, cb, i) => (i ? cb(res) : cb()), null);

mix(
  () => 0,
  (prev) => prev + 1,
  (prev) => prev * 2
);

注意:您仍然需要初始值,因为如果提供初始值,那么reduce 将从第二个值开始迭代并假定第一个值为初始值。

【讨论】:

  • 为什么初始值未定义?
  • 您需要为reduce 提供一个初始值,否则它会从第二个值开始迭代并假定第一个值是初始值(read here)。并且使用undefined 调用第一个函数应该没有问题。
  • 这与第一个函数应该在没有参数的情况下调用的要求有细微的差异,但这里它是用undefined 的单个参数调用的。在大多数情况下,这不会产生影响。我为相同的想法写了一个稍微不同的版本:const mix = (...fns) => fns .reduce ((r, fn, i) => i == 0 ? fn () : fn (r), null)null 是一个占位符,用于阻止 reduce 使用第一个提供的元素作为初始值,但它将被忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多