今天发现一段代码,发生了奇怪的回调混乱现象
调用的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回调函数...
android中WebView回调js的方法
如何向回调函数中传参数 最近写JS经常会因为向回调函数中传参而头疼,今天总结一下向回调函数中传参的方法,以后的应用中就不用在到处去找了。
回调示例
百度地图添加路书后回调js,基于Lushu.js 修改,添加了回调方法。很多时候我们需要在路书跑完之后去执行一些相应的操作,如路书开始的时候我们把所有的路线绘制下来,跑完之后需要清理;路书结束后需要给用户提示等
理解JavaScript的闭包是迈向高级JS程序员的必经之路, 理解了其解释和运行机制才能写出更为安全和优雅的代码。
代码为js+html代码,下载后运行index.html 即可看到效果,可以支付0.10元测试回调。然后将系统中支付信息替换为自己的支付信息,然后修改支付成功的回调,即可实现自己的支付业务,非常简单方便。无积分或者免积分...
页面调用activex控件及c#回调页面js方法,将activex信息返回页面,测试前请运行debug文件夹中的1.bat将activex控件注册后,直接打开示例页面即可
回调函数被连续执行两次或多次的原因: 根本原因:回调函数的事件预订【+=】语句被执行了两次或多次。 实例:移动web页的代码页类MobileDefault的Page_Init事件过程,包含的InitializeComponent()连续出现了两次...
css文件未做任何修改,js文件添加了DaDaCallBack回调函数(点击确定按钮后回调)calendar.init({'DaDaCallBack':function(value)});
JS回调Demo
js回调函数,回调函数.js描述了回调函数定义以及用途
js回调函数
这份资源详细介绍了JavaScript中回调函数的概念和用法。文档中提供了回调函数的基本定义、回调函数的使用场景以及回调函数的实现方法等多个方面的内容,为开发者提供了全面的指导和帮助。 本文档还介绍了如何使用回...
这是一款基于ThinkPHP6.0开发的微信公众号多域名回调系统。本系统有如下功能: 微信公众号多域名回调功能:微信公众号后台默认只能授权2个网页域名,用本系统突破这个限制,用同一个公众号对接无限多个网站。网站...
javascript 回调函数示例
理解和使用 JavaScript 中的回调函数,,,,,,,,,,,,,,,,,,
在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。因此callback 不一定...
使用vc6开发的ocx控件,在js脚本中进行调用,js对ocx回调进行响应
1、自己手写的javascript ajax异步调用 并回调js函数传参。 2、异步调用并实现xsl 解析xml