[JavaScript] 开发时期如何Debug使用Jscex开发的程序
在前一篇文章中,我们介绍了如何使用Jscex进行开发,它可以让我们以同步的方式撰写异步的程序,大幅度增加程序的可读性,
Jscex在开发时期,透过即时的compile程序并执行compile后的程序来运行,(当然在上线时期我们已经预编译过JS文件,不再有runtime编译的性能issue)但也因为这种方式,可能会让很多人想要Debug时无从下手,让我们来看看实际上可能发生的使用情境。
前言
在前一篇文章中,我们介绍了如何使用Jscex进行开发,
它可以让我们以同步的方式撰写异步的程序,大幅度增加程序的可读性,
Jscex在开发时期,透过即时的compile程序并执行compile后的程序来运行,
(当然在上线时期我们已经预编译过JS文件,不再有runtime编译的性能issue)
但也因为这种方式,可能会让很多人想要Debug时无从下手,
让我们来看看实际上可能发生的使用情境。
本次范例使用chrome做为Debug工具
问题点
首先我们使用Jscex撰写一个简单的Ajax Request,
它会向Server端请求使用者数据,而Server端则会回传一个Json格式的使用者数据,
点我看完整范例
var queryAsync = eval(Jscex.compile("async", function () {
var result = $await($.ajaxAsync({
url: '/WebApi/GetUserData.svc',
type: 'GET',
dataType: "json"
}));
$("span#result").text(result.data.message);
}));
而在以往如果我们想要知道ajax所回传的数据是什么,我们通常会使用Debug Tool下中断点
但当我们实际执行程序的时候发现,程序并不会停留在中段点的地方,
这是因为实际上浏览器真正执行的,是compile之后的程序,不再是原本撰写的程序,
所以并不能直接用设定中段点的方式来Debug,我们可以利用其他的技巧来进行Debug
使用console.log进行Debug
console.log是我们在Debug javascript时很常使用的function,
我们可以修改程序,在接受到回传值后使用console.log打印出回传的对象
var queryAsync = eval(Jscex.compile("async", function () {
var result = $await($.ajaxAsync({
url: '/WebApi/GetUserData.svc',
type: 'GET',
dataType: "json"
}));
console.log(result);
$("span#result").text(result.data.message);
}));
同时我们再打开chrome的Debug Tool,切到Console Tab并重新执行程序
我们可以发现使用chrome的debug tool甚至可以完全展开或收合Object,非常的亲切,
如果我们需要显示回传的使用者资讯,只要调用result.data.message就可以取得了!
使用debugger强制中断
若今天我们并不想用使用console.log,而是希望程序可以透过debug tool,
确实的中断在我希望停止的地方,并且我可以在那个时间点观察我所想查询的各种资讯,
我们可以使用debugger,来让debug tool在执行到debugger的时候强制进入中断点
var queryAsync = eval(Jscex.compile("async", function () {
var result = $await($.ajaxAsync({
url: '/WebApi/GetUserData.svc',
type: 'GET',
dataType: "json"
}));
debugger;
$("span#result").text(result.data.message);
}));
打开debug tool并执行网页
我们可以看到不但停在compile后的程序,我们想要中断的地方,
甚至我们可以在这个时间点关查所有想要查看的变量,
是不是很简单呢?
错误提示消息
在写JavaScript的时候,有时候可能会因为笔误,或是没有拦截到预期的异常,
却发现我们的程序没办法work,这时会很仰赖debug tool来查出发生错误的原因,
而Jscex所compile的程序中都会具有Logging机制,
它会拦截compile过的程序之中所发生的exception,并输出Log到console中,(你所遗漏没处理过的exception)
假设今天我们在取ajax回传时不小心笔误少打一个a
var queryAsync = eval(Jscex.compile("async", function () {
var result = $await($.ajaxAsync({
url: '/WebApi/GetUserData.svc',
type: 'GET',
dataType: "json"
}));
$("span#result").text(result.dat.message);
}));
我们重新执行程序发现不能work了,这时我们打开console可以看到
如此一来就可以根据message发现,原来是我们的data少打一个a,造成错误导致程序异常
结语
虽然Jscex并不能直接在我们以特殊语法撰写的程序之中设置中断点,
但我们可以利用console.log或是debugger来准确的输出我们想要查询的资讯,
而Jscex也很贴心的在compile后的程序左侧提供原始程序的对照,来方便我们进行Debug,
甚至是在compile后的程序发生并未处理的异常,也可以透过Log来发现,
我们在使用Jscex进行开发时可以利用以上的技巧,根据各人的需要来使用,
也欢迎大家提供自己的Debug方法,请大家多多指教或一起讨论 ^_^
参考数据:
- 善用 JavaScript 的 debugger 命令让网页主动进入中断点
- 利用Firebug的console功能作JavaScript侦错
原文:大专栏 [JavaScript] 开发时期如何Debug使用Jscex开发的程序
原文地址:https://www.cnblogs.com/chinatrump/p/11516485.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端基础:HTML
- SignalR 2.x入门(一):SignalR简单例子
- 设计模式(5)[JS版]-JavaScript如何实现工厂方法模式?
- 前端基础:CSS
- 实现一个分布式调用链路追踪Java探针你可能会遇到的问题
- 设计模式(6)[JS版]-JavaScript如何实现抽象工厂模式?
- 前端基础:JavaScript
- 设计模式(7)[JS版]-JavaScript设计模式之原型模式如何实现???
- SignalR 2.x入门(二):SignalR在MVC5中的使用
- SignalR简介
- 前端基础:jQuery
- Web API--入门--(一)ASP.NET Web API 2(C#)入门
- C# 关键字之 decimal
- 设计模式(8)[JS版]-JavaScript设计模式之如何实现适配器模式???
- Python3与OpenCV3.3 图像处理(二)--图像基本操作