连锁回调的最佳方式?

2023-12-23

我有一个关于在回调之间传递数据时将回调链接在一起的最佳方法的问题。我下面有一个示例,它可以工作,但有一个缺陷,即函数必须了解链并知道它们的位置/是否传递回调。

function first(data, cb1, cb2, cb3){
    console.log("first()", data);
    cb1(data,cb2, cb3);
}
function second(data, cb1, cb2) {
    console.log("second()",data);
    cb1(data, cb2);
}
function third(data, cb) {
    console.log("third()",data);
    cb(data);
}
function last(data) {
    console.log("last() ", data);
}
first("THEDATA", second, third, last);  // This work OK
first("THEDATA2", second, last);        // This works OK
first("THEDATA3", second);              // This doesn't work as second tries to pass on a callback that doesn't exit.

我可以想出很多方法来解决这个问题,但它们都涉及让被调用的函数了解正在发生的事情。但我的问题是,我正在处理的真实函数已经存在,如果可以避免的话,我不想修改它们。所以我想知道我是否错过了如何调用这些的技巧?


感谢您的回答,我同意 Promise 可能是最合适的解决方案,因为它们满足我的要求并提供了许多其他优势。

不过,我也想出了如何在不涉及任何额外模块的情况下做我想做的事情。

回顾一下具体要求是:

  • 通过回调将多个函数链接在一起(这样第一个函数可以使用其他函数所依赖的非阻塞 I/O 调用),
  • 在它们之间传递参数(数据)时,以及
  • 无需修改现有函数即可了解它们在回调链中的位置。

我缺少的“技巧”是引入一些额外的匿名回调函数来充当现有函数之间的链接。

// The series of functions now follow the same pattern, which is how they were before
// p1 data object and p2 is a callback, except for last().
function first(data, cb){
    console.log("first()", data);
    cb(data);
}
function second(data, cb) {
    console.log("second()",data);
    cb(data);
}
function third(data, cb) {
    console.log("third()",data);
    cb(data);
}
function last(data) {
    console.log("last() ", data);
}

// And the named functions can be called pretty much in any order without 
// the called functions knowing or caring. 

// first() + last()
first("THEDATA", function (data) { // The anonymous function is called-back, receives the data, 
    last(data);                    // and calls the next function.
});

// first() + second() + last()
first("THEDATA2", function (data) {
    second(data, function (data){
        last(data);
    }); // end second();
}); // end first();

// first() + third()! + second()! + last()
first("THEDATA3", function (data) {
    third(data, function (data){
        second(data, function (data){
            last(data);
        }); // end third();
    }); // end second();
}); // end first();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连锁回调的最佳方式? 的相关文章

随机推荐

  • Apache Ignite 使用 Spring-Boot 加载两次?

    我正在使用 Spring Boot 1 2 7 RELEASE 和 Apache Ignite 1 4 0 进行原型设计 并注意到有些奇怪的东西 也许这只是一个日志配置 看起来 Apache Ignite 正在尝试用 Spring 启动两次
  • 在重定向之前设置 cookie

    我试图在标头重定向之前设置 cookie 但它不起作用 我读过在标头重定向行之后设置 cookie 应该可以解决问题 但我没有运气 同样 之前的一篇文章建议 如果您在位置重定向中使用 人类 URL 则应该在 cookie 的路径参数中使用
  • 在 Interface Builder 中将文本标记为不需要翻译

    我在 Interface Builder 中使用虚拟文本 这是一个例子 The MYNAME不是真正的界面文本 它是以编程方式设置的viewDidLoad 我可以用特殊方式标记它 以便默认将其从我的翻译文件中排除吗 如果您正在使用ibtoo
  • Capistrano 使用 sudo 甚至使用“set :use_sudo, false”

    我不希望使用 sudo 通过 Capistrano 执行任何远程命令 具体来说 当我跑步时cap deploy setup 第一次时要求我输入 sudo 密码mkdir命令 我添加了set use sudo false到我的deploy r
  • SqlCipher Mingw/msys 问题

    我有一个问题 我无法编译 SqlCipher 我正在用这个http groups google com group sqlcipher browse thread thread 55c6296b56bf4533 c792bbec6df7d4
  • 如何在jquery中引用JSF组件Id? [复制]

    这个问题在这里已经有答案了 我如何在 jquery 中引用 JSF 组件 因为我不知道要引用的组件 id 前面的 id 你可以付出一切NamingContainer http download oracle com javaee 6 api
  • Prometheus-如何监控其他docker容器

    我想用普罗米修斯监控我的docker容器 我可以跑普罗米修斯 with Grafana但我不知道如何指示它监视其他 docker 容器 如果可能的话我想看一些例子 例如我有Ubuntu在我的主机上运行的容器以及Gentoo容器 我如何告诉
  • 中间件应该总是调用下一个?

    我一直在尝试了解 ASP NET 5 管道中间件的真正工作原理 据我所知 中间件只是一个Func
  • 允许对 C++11 中的循环进行编译器优化

    是否允许符合 C 11 的编译器优化 转换此代码 bool x true not an atomic type but suppose bool can be read written atomically while x spins un
  • 用鼠标移动 QGraphicsRectItem

    将 QGraphicsRectItem 添加到场景后 我试图移动它 它会移动 但与鼠标指针有一定的偏移 我认为这只是将鼠标指针位置添加到其原始位置 我不知道如何解决这个问题 这是我的代码 class ucFilter public QGra
  • 覆盖 Python Tkinter 中的默认选项卡行为

    我正在使用 Tkinter 用 Python 编写一个应用程序来管理我的 GUI 有一个文本输入框 我试图在其中实现自动完成功能 该功能将绑定到 Tab 键 我已将 Tab 键绑定到输入框 但是当我按 Tab 时 程序会尝试在 GUI 元素
  • 本例中 Canvas.Context Save 和 Restore 的目的是什么?

    这一页 http www authorcode com text animation in html5 在 HTML5 画布中显示一些动画 如果你看一下滚动条的来源 http www authorcode com scrolling tex
  • Canvas lineTo() 在错误的位置绘制 y 坐标

    我正在尝试使用 ctx lineTo 在画布上绘制一些矩形 它们被绘制 但 y 坐标永远不正确 矩形变得太高并且位于 y 轴上的错误位置 当我使用调试器单步执行时 它显示 lineTo 方法中的 y 坐标是正确的 但我创建了一个 canva
  • 将 IQueryable 对象转换为另一个对象?

    我不知道关键字是什么 所以这里是我想要的示例 return from i in userRepo GetUsers select new SimpleUser i UserId i Name userRepo GetUsers 返回类型IQ
  • 如何从 python 源代码中删除注释和文档字符串? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个程序可以像这样运行 py2py py lt orig py gt smaller py 其中
  • Java 多维数组被视为基元或对象

    Is int matrix new int 10 10 一个原语还是一个对象 当我将它作为参数发送给函数时 它是否发送其引用 如对象 或其值 如基元 每个 Java 数组都是一个对象 当您将其作为参数传递时 您将传递该数组的引用的副本
  • 使用 jQuery 进行 Xml 调用(无效的 XML)

    我有一个问题 我想使用 jQuery 从 XML 文件中获取一些数据 如果我可以说它是 XML 文件 这是我的 jQuery 它适用于普通的 XML 文件 ajax type GET url test xml dataType xml su
  • PHP“Session_regenerate_id”和用户身份验证

    我正在我的网站上创建一个登录功能 并且正在考虑在每个页面上重新生成会话 ID 以使事情更加安全 我已阅读 PHP s 有关 regenerate id 的信息 但 PHP 页面上的帖子与他们提供的有关 session regenerate
  • TransformerConfigurationException:无法设置 Transformer 的功能

    我在设置 TransformerFactory 的功能时遇到以下错误 javax xml transform TransformerConfigurationException Cannot set the feature http apa
  • 连锁回调的最佳方式?

    我有一个关于在回调之间传递数据时将回调链接在一起的最佳方法的问题 我下面有一个示例 它可以工作 但有一个缺陷 即函数必须了解链并知道它们的位置 是否传递回调 function first data cb1 cb2 cb3 console l