`

奇怪的js回调混乱

 
阅读更多

今天发现一段代码,发生了奇怪的回调混乱现象

调用的API是这样的:


api.method = function(sql, condition, successCallback, failureCallback){
    // logic
}

我们自己的业务代码调用了这个函数:

var sql = "insert into xxxx";

var condition = {};

api.method(sql, condition, function(result){
    // callback when success
}, function(err){
    // callback when error
});

原来的理解,应该是调用这个函数之后,如果结果正确,第一个回调函数会被调用;否则第二个回调函数被调用。实际上发现,确实调用了第一个回调函数,但是没执行完,又突然跳到第二个回调函数里

最后只好去看api.method的源码,发现其内部是类似这样处理的:

api.method = function(sql, condition, successCallback, failureCallback){

    var result = {};

    // do some logic
    if(err){
        failureCallback(err);
        return;
    }

    try{
        successCallback(result);
    }catch(err){
        failureCallback(err);
    }
}

如上,successCallback是被try...catch包裹住的,如果执行successCallback的过程中,同步方法抛出了异常,就会中止successCallback,转而执行failureCallback。于是接下来检查我们的successCallback,果然有一行代码抛出了异常

感想:

1、我们的代码里,try...catch用得比较少,其实代码还是比较脆弱的,像这种错误就很难定位,甚至有时候默默地出错了,很长时间都发现不了。所以在容易出错的地方,主动地加上try...catch可能会好一点。在这一点上,JAVA就比较好,虽然CheckedException,UncheckedException遭到很多人诟病,嫌其繁琐,不优雅,但是其实在异常的捕获和定位方面,还是很有帮助的

2、上述API的设计,我觉得并非完全没有道理,在成功回调错误的情况下,可以跳转到错误回调,还是挺机智的。但是仅对同步方法有效,如果我的成功回调里,包含异步函数,它照样无法捕获到异步函数内部的错误,所以也不是很可靠。另外,中断一个回调,跳转到另一个回调,这是明显的潜规则,绝对会令调用者误解,所以如果加上注释和日志,就会好很多

分享到:
评论

相关推荐

    js回调函数的使用技巧和认识

    js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数js回调函数...

    理解和使用 JavaScript 中的回调函数

    ### 理解和使用 JavaScript 中的回调函数 在 JavaScript 中,回调函数是一种常见的功能编程技术,被广泛应用于各种场景之中。本文旨在深入探讨回调函数的概念、工作原理以及如何在实际开发中应用它们。 #### 一、...

    JavaScript回调函数面试题.zip

    JavaScript回调函数是JavaScript异步编程的核心机制之一,它在处理事件、网络请求、定时任务等方面发挥着重要作用。本文将深入探讨JavaScript回调函数的概念、特点、使用场景以及面试中常见的问题。 **1. 回调函数...

    LCalendar最新版 移动端时间控件添加回调函数

    改动主要集中在JavaScript文件上,添加了名为"DaDaCallBack"的回调函数。这个回调函数的目的是在用户在LCalendar中选择完日期或时间并点击确定按钮后执行。通过这样的设计,开发者可以自定义在用户完成日期选择后的...

    js回调函数.doc文档

    总的来说,JavaScript回调函数是异步编程的核心工具,它们帮助我们在单线程环境中处理复杂的异步任务,但同时也需要谨慎处理,避免回调地狱的问题。通过学习和掌握回调函数的使用,开发者能够更好地构建高效、响应式...

    javascript回调函数详解参考.docx

    以下是一些关于JavaScript回调函数的关键点: 1. **回调函数定义**:回调函数是一个作为参数传递给其他函数的函数,这个参数通常是一个函数引用。当外部函数执行完毕或满足特定条件时,它会调用这个传递进来的函数...

    回调函数被连续执行两次或多次的原因

    ### 回调函数被连续执行两次或多次的原因 在编程领域,回调函数是一种常见的编程模式,它允许将函数作为参数传递给另一个函数,并在适当的时机由后者调用。这种模式非常有用,尤其是在处理异步操作时。然而,在某些...

    回调函数应用.rar

    回调函数在IT行业中是至关重要的一个概念,尤其是在JavaScript、Python等编程语言中广泛使用。回调函数是一种函数,它作为参数传递给另一个函数,并在特定条件满足时被调用执行。这种设计模式允许我们延迟执行代码,...

    回调函数demo

    - 定时器:在JavaScript中,`setTimeout`和`setInterval`函数接受一个回调函数,指定在一定时间后执行的代码。 五、回调地狱与解决方案 虽然回调函数为异步编程提供了便利,但当多个异步操作串联起来时,可能导致...

    laydate V1.1 支持清除回调事件

    在laydate V1.1版本的压缩包中,通常会包含laydate的核心JavaScript文件,例如`laydate.js`,以及相关的CSS样式文件和示例文件。开发者可以通过查看源码和示例来更深入地了解如何利用`clear`回调以及其他laydate的...

    微信公众号多域名回调系统 微信公众号多域名回调功能:微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号

    这是一款基于ThinkPHP6.0开发的微信公众号多域名回调系统。本系统有如下功能: 微信公众号多域名回调功能:微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。网站...

    js回调函数的介绍和使用

    JavaScript中的回调函数是异步编程的核心机制之一,它在处理事件驱动和非阻塞I/O操作时发挥着关键作用。回调函数的主要目的是解决程序执行顺序的问题,特别是在处理那些需要等待某些操作完成才能继续执行的场景。 ...

    帮助理解回调函数的简洁实例

    例如,一个简单的JavaScript回调函数用法可能是: ```javascript function doSomethingAsync(callback) { setTimeout(() => { // 异步操作 callback('操作已完成'); }, 1000); } function logResult(result) {...

    表格 demo datatables 回调

    在"表格 demo datatables 回调"中,"回调"可能指的是Datatables的事件回调或API方法,如`fnDrawCallback`,它会在表格重绘后触发,允许我们执行诸如调整列宽、添加自定义样式等操作。此外,`ajax.dataSrc`回调可用于...

    回调函数.js描述了回调函数定义以及用途

    js回调函数,回调函数.js描述了回调函数定义以及用途

    js调用ocx控件 响应回调

    总的来说,JS调用OCX控件并响应回调是一项涉及浏览器、JavaScript、ActiveX和C++编程的技术,主要用于实现Web与本地系统的深度交互。虽然现代Web开发倾向于使用更安全的Web API和框架,但在一些遗留系统中,这种技术...

    [JavaSrcipt]-JS回调函数.pdf

    JavaScript中的回调函数是一种重要的编程模式,它主要用于处理异步操作,确保在特定任务完成之后执行特定的代码。回调函数的基本概念是将一个函数作为参数传递给另一个函数,然后在内部函数执行完毕时调用这个传递的...

    javascript 回调函数详解

    JavaScript中的回调函数是一种重要的编程模式,它允许我们将一个函数作为参数传递给另一个函数,以便在特定条件下或事件发生时执行。这种技术广泛应用于处理异步操作,如Ajax请求、定时器(setTimeout和setInterval...

    javascript 回调函数示例

    javascript 回调函数示例

    oss web端图片直传回调 java签名+html+javaScript maven项目

    综上所述,这个项目提供了一个完整的示例,涵盖了从HTML界面、JavaScript上传逻辑到Java签名和回调处理的全过程,对于理解OSS Web端图片直传有很好的参考价值。然而,由于技术的不断更新,使用时可能需要对代码进行...

Global site tag (gtag.js) - Google Analytics