今天发现一段代码,发生了奇怪的回调混乱现象
调用的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回调函数...
JavaScript回调函数是异步编程的一种常见模式,它在JavaScript中扮演着至关重要的角色,尤其是在处理I/O操作、网络请求和时间间隔等耗时任务时。本文将深入探讨JavaScript回调函数的概念、工作原理以及如何在实际...
代码为js+html代码,下载后运行index.html 即可看到效果,可以支付0.10元测试回调。然后将系统中支付信息替换为自己的支付信息,然后修改支付成功的回调,即可实现自己的支付业务,非常简单方便。无积分或者免积分...
本文将详细讨论如何在页面中调用ActiveX控件以及如何通过C#实现回调机制,将信息传回JavaScript。 首先,创建一个ActiveX控件,这通常是一个用C#编写的.NET Framework类库项目。在C#中,我们可以定义一个类,该类...
- 错误优先回调:通常在Node.js和其他一些库中,回调函数的第一个参数用于传递错误对象。如果在执行过程中没有错误,该参数通常是`null`。例如: ```javascript fs.readFile('file.txt', 'utf8', function(err, ...
以下是一些关于JavaScript回调函数的关键点: 1. **回调函数定义**:回调函数是一个作为参数传递给其他函数的函数,这个参数通常是一个函数引用。当外部函数执行完毕或满足特定条件时,它会调用这个传递进来的函数...
回调函数在IT行业中是至关重要的一个概念,尤其是在JavaScript、Python等编程语言中广泛使用。回调函数是一种函数,它作为参数传递给另一个函数,并在特定条件满足时被调用执行。这种设计模式允许我们延迟执行代码,...
- 定时器:在JavaScript中,`setTimeout`和`setInterval`函数接受一个回调函数,指定在一定时间后执行的代码。 五、回调地狱与解决方案 虽然回调函数为异步编程提供了便利,但当多个异步操作串联起来时,可能导致...
JavaScript回调函数是编程中一种常见的技术,特别是在异步编程领域。回调函数允许我们将一个函数作为参数传递给另一个函数,以便在特定条件满足时执行。这种技术在JavaScript中尤为重要,因为JavaScript是单线程的,...
例如,一个简单的JavaScript回调函数用法可能是: ```javascript function doSomethingAsync(callback) { setTimeout(() => { // 异步操作 callback('操作已完成'); }, 1000); } function logResult(result) {...
在laydate V1.1版本的压缩包中,通常会包含laydate的核心JavaScript文件,例如`laydate.js`,以及相关的CSS样式文件和示例文件。开发者可以通过查看源码和示例来更深入地了解如何利用`clear`回调以及其他laydate的...
总的来说,JS调用OCX控件并响应回调是一项涉及浏览器、JavaScript、ActiveX和C++编程的技术,主要用于实现Web与本地系统的深度交互。虽然现代Web开发倾向于使用更安全的Web API和框架,但在一些遗留系统中,这种技术...
JavaScript中的回调函数是一种重要的编程模式,它主要用于处理异步操作,确保在特定任务完成之后执行特定的代码。回调函数的基本概念是将一个函数作为参数传递给另一个函数,然后在内部函数执行完毕时调用这个传递的...
JavaScript中的回调函数是一种重要的编程模式,它允许我们将一个函数作为参数传递给另一个函数,以便在特定条件下或事件发生时执行。这种技术广泛应用于处理异步操作,如Ajax请求、定时器(setTimeout和setInterval...
4. **回调函数(Callback Functions)**:在异步请求中,我们通常需要定义回调函数来处理服务器的响应。对于`fetch`,可以使用`.then`和`.catch`来处理成功的响应和错误。对于`XMLHttpRequest`,可以监听`...
综上所述,这个项目提供了一个完整的示例,涵盖了从HTML界面、JavaScript上传逻辑到Java签名和回调处理的全过程,对于理解OSS Web端图片直传有很好的参考价值。然而,由于技术的不断更新,使用时可能需要对代码进行...
**WCF回调与服务客户端示例** Windows Communication Foundation (WCF)是.NET Framework中的一个核心组件,用于构建可互操作的分布式系统。WCF提供了一种统一的方式,用于创建、部署和管理跨越多个网络、安全性和...
在JavaScript、Java、C#等编程语言中,回调都是一个非常基础的概念。让我们深入探讨一下回调的原理和应用。 1. 回调的基本概念: - 回调函数:一个可以在其他函数执行完毕后被调用的函数,通常作为参数传递给另一...
回调函数在编程中是一种常见的设计模式,特别是在异步编程中,它被广泛应用于JavaScript、Python等语言中。回调函数的基本思想是将一个函数作为参数传递给另一个函数,然后在内部函数执行完毕后调用这个传入的函数。...
1. 代码结构混乱:回调地狱可能导致代码难以阅读和调试。 2. 错误处理困难:错误通常需要通过回调函数的错误参数来捕获,增加了错误处理的复杂性。 3. 阻塞问题:如果回调函数执行时间过长,可能会阻塞后续回调的...