用于处理多个未知回调的 JavaScript 函数

2023-12-08

我有一个场景,我想将 2 个或更多函数(作为参数)发送到处理函数中,并让该处理函数执行每个传递的函数作为前面函数的回调函数。

这是我试图编写的函数的一般概念:

function functionChain() {
   // MAKE SURE WE HAVE AT LEAST 1 PARAMETER
   if ( arguments.length < 1 ) { return; }

   // for each parameter, call it (as a function)
   for ( var i=0; i<arguments.length; i++) {
     if ( typeof arguments[i] === 'function' ) {    
       call arguments[i];
     }
   }
}
// example
functionChain( function1, function2, function3 );

...所以在上面的代码中,每个函数都会被连续调用。

我遇到困难的是如何在前一个函数完成时将每个调用视为回调。

我处理这个问题的方法是有一个变量(为了简单起见,我们只说一个名为 functionChainComplete 的全局变量),然后等待启动下一个函数——当然,我调用的每个函数都会将 functionChainComplete 设置为 true。所以,像这样:

// set global var for tracking
var functionChainComplete;

function functionChain() {
   // MAKE SURE WE HAVE AT LEAST 1 PARAMETER
   if ( arguments.length < 1 ) { return; }

   // SET GLOBAL VAR TO FALSE
   functionChainComplete = true;

   // for each parameter, call it (as a function)
   for ( var i=0; i<arguments.length; i++) {
     if ( typeof arguments[i] === 'function' ) {    
       if ( functionChainComplete == true ) {
         // call the next function and wait for true again
         functionChainComplete = false;
         call arguments[i];
       } else {
         // try again in 50 ms (maybe setTimeout)?
       }
     }
   }
}

function1() { 
    // do something, and when done, reset functionChainComplete
    functionChainComplete = true;
}

function2() { 
    // do something, and when done, reset functionChainComplete
    functionChainComplete = true;
}

function3() { 
    // do something, and when done, reset functionChainComplete
    functionChainComplete = true;
}

// example
functionChain( function1, function2, function3 );

正如您所看到的,上面的代码没有解决回调部分,我不知道从哪里获取它 - 我怀疑某种递归函数?我被困住了。


假设你有一些功能,double,这需要一个参数,x,和一个回调,k

const double = (x, k) =>
  k(x * 2)
  
double(2, console.log) // 4
double(3, console.log) // 6

现在假设我们要连续运行 3 次

const double = (x, k) =>
  k(x * 2)
      
const tripleDouble = (x, k) =>
  double(x, y =>
    double(y, z =>
      double(z, k)))
      
tripleDouble(2, console.log) // 16
tripleDouble(3, console.log) // 24

但当然我们必须对每个延续进行静态编码(y => ..., and z => ...)。我们如何使这项工作与可变金额(数组)函数?

const double = (x, k) =>
  k(x * 2)
  
const composek = (...fs) => (x, k) =>
  fs.reduce((acc, f) =>
    k => acc(x => f(x, k)), k => k(x)) (k)
  
const foo = composek(double, double, double)

foo(2, console.log) // 16
foo(3, console.log) // 24

这对于一些抽象来说已经成熟了,并介绍了我最喜欢的单子,延续单子。

const Cont = f => ({
  runCont: f,
  chain: g =>
    Cont(k => f(x => g(x).runCont(k)))
})

Cont.of = x => Cont(k => k(x))

const composek = (...fs) => (x, k) =>
  fs.reduce((acc,f) =>
    acc.chain(x =>
      Cont(k => f(x,k))), Cont.of(x)).runCont(k)
      
const double = (x, k) =>
  k(x * 2)
  
const foo = composek(double, double, double)

foo(2, console.log) // 16
foo(3, console.log) // 24

如果你可以自由地改变你链接的函数,这会清理得更多一些——在这里,double有 1 个参数并返回一个Cont而不是将回调作为第二个参数

const Cont = f => ({
  runCont: f,
  chain: g =>
    Cont(k => f(x => g(x).runCont(k)))
})

Cont.of = x => Cont(k => k(x))

// simplified
const composek = (...fs) => (x, k) =>
  fs.reduce((acc,f) => acc.chain(f), Cont.of(x)).runCont(k)

// simplified
const double = x =>
  Cont.of(x * 2)
  
const foo = composek(double, double, double)

foo(2, console.log) // 16
foo(3, console.log) // 24

当然,如果double实际上是异步的,它的工作原理是一样的

// change double to be async; output stays the same
const double = x =>
  Cont(k => setTimeout(k, 1000, x * 2))

const foo = composek(double, double, double)

foo(2, console.log) // 16
foo(3, console.log) // 24
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于处理多个未知回调的 JavaScript 函数 的相关文章

随机推荐

  • Android AdapterView 点击监听器参数 - 位置和 id

    我在列表视图上设置一个长单击侦听器 我想使用单击项目的索引来检索相应的对象 方法签名和参数定义根据安卓文档 public abstract boolean onItemLongClick AdapterView
  • TcpListener 与 SocketAsyncEventArgs

    是否有正当理由不使用TcpListener用于实现高性能 高吞吐量TCP服务器而不是SocketAsyncEventArgs 我已经使用以下方法实现了这个高性能 高吞吐量 TCP 服务器SocketAsyncEventArgs使用大的预分配
  • WebBrowser - 空文档文本

    我正在尝试使用WebBrowser类 但当然这是行不通的 My code WebBrowser browser new WebBrowser browser Navigate http www google com while browse
  • 黑莓 - 更改设备上的纬度和经度以测试应用程序

    我想在设备上测试我的应用程序 是否可以在设备设置中的某个位置对纬度和经度值进行硬编码 以便应用程序读取这些值而不是当前位置 我想在当前位置以外的不同位置测试我的应用程序 在 BB 模拟器中 您可以转到 模拟 gt GPS 位置 单击 添加
  • 在 Google 地图中显示我当前的位置

    最后我成功显示了地图 现在 我想显示我当前的位置 我尝试使用这些代码 但当我单击右上角的我的位置按钮时它不起作用 AndroidManifest xml
  • 如何检测正在编辑的单元格是否属于定义的名称范围的最后一行

    我有一个定义的名称 称为 Input Range 如果正在编辑输入范围的最后一个空行 向空行添加值 则自动插入一个空行 我已经研究这个问题几天了 但没有解决方案 我只能做 Worksheet change 事件检测定义的名称范围内的数据是否
  • 如何抓取 Tableau 仪表板,其中单击地图后数据仅显示在图中?

    我正在尝试从中抓取数据这个公共 Tableau 仪表板 兴趣在于时间序列绘制的数据 如果我单击地图中的特定状态 时间序列将更改为该特定状态 下列的this and this我得到了在国家一级汇总的时间序列的结果 使用下面提供的代码 但我感兴
  • 我可以在打字稿中声明静态私有函数吗?

    我有以下代码 module Dialog export class Modal static createAccessModal link Link createModal link static createAdminModal link
  • 将 android:layoutAnimation 添加到 LinearLayout 会导致 FC

    我在 menu xml 中有以下 XML 它是一个我需要设置动画的 LinearLayout 因此我使用layoutAnimation 属性 如果没有这个属性 布局会完美地显示 但是设置了这个属性后 我会得到一个令人讨厌的强制关闭 我不明白
  • 您的 BDD 规范是否应该与 UI 测试分开?

    昨天我参加了一场精彩的演讲戈伊科 阿季奇关于 BDD 我可能错过了他说的一两件事 所以这里有一个问题希望能为我澄清一些事情 通常 当您在网上看到 BDD 示例时 它们会在 UI 中包含步骤 在小黄瓜语言中 您经常可以看到类似以下内容 Sce
  • Android Web 视图中的所见即所得

    我一直在尝试从我的应用程序内部向我的用户提供所见即所得的 HTML 编辑器 它不必是花哨的所见即所得 我只需要基本功能 如粗体 斜体 下划线 图像 链接和一些基本格式 字体大小 颜色 对齐方式 那应该足够了 完美的解决方案是一个开源库 但我
  • Angular 4:API调用后更新模板变量[重复]

    这个问题在这里已经有答案了 我有一个组件指令 用于显示带有一些信息的 div 该组件称为站点组件并包含在页面中 该人的主要行为站点组件很好 除了这个 我有一个对后端的 API 调用 我在其中返回一些数据 后端调用执行良好 我收到了信息 但变
  • 在内联汇编中使用双精度数字(GCC、IA-32)

    我刚刚开始在计算机科学课上学习汇编 并且我有一项作业是使用指定的舍入模式对浮点值进行舍入 我尝试使用它来实现fstcw fldcw and frndint 我修改舍入控制位 对数字进行舍入 然后恢复以前的控制位 分配的要求 目前突出的问题是
  • 为什么协程停止工作/执行

    我有一个 3 秒倒计时器 当游戏取消暂停时会激活该计时器 几天前我还可以正常工作 但现在它不再工作了 它在号码 3 上被阻止 这是代码 IEnumerator Timer Time timeScale 0 objectWithGSScrip
  • 如何有效地使用绑定框架

    我已经使用绑定框架有一段时间了 我想知道您如何处理这种情况 你有一份报纸 它有一些属性 比如 字符串 标题 布尔值 已发布 日期 出版日期 在您看来 您有一份报纸列表 可以同时编辑所有报纸 这意味着您可以在单个请求中更改所有报纸的标题或所有
  • 实体框架在哪里存储属性名称与其在 SQL 中选择的列之间的映射?

    我正在尝试使用 ObjectQuery 的 ToTraceString 在 EF 4 3 上构建一些自定义扩展 以从 LINQ 代码生成原始 SQL 我注意到 虽然在某些情况下 SQL 中的列名称与查询元素类型的属性名称相匹配 但在其他情况
  • 为什么代码 this 指向 window 对象?

    我的代码是 var length 20 function fn console log this length var o length 10 e function fn fn arguments 0 o e fn 输出是20 1 谁能告诉
  • 所有浏览器都会忽略无名输入字段吗?

    如果没有指定 name 属性 是否可以保证浏览器不会发送输入元素 例如 我们可以假设 POST 下面的表单不会发送信用卡号吗
  • NullPointerException:重写派生类中基类的构造函数调用方法

    我有这个代码片段 class Base public Base method void method System out println In Base class Derived extends Base private String
  • 用于处理多个未知回调的 JavaScript 函数

    我有一个场景 我想将 2 个或更多函数 作为参数 发送到处理函数中 并让该处理函数执行每个传递的函数作为前面函数的回调函数 这是我试图编写的函数的一般概念 function functionChain MAKE SURE WE HAVE A