`
tedeyang
  • 浏览: 326125 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

回顾一下我早期写的javascript代码

    博客分类:
  • WEB
 
阅读更多

今天和几个人聊javascript开发的代码风格和设计,深感时代在变迁,新人的起点总是比老人要高,无需走我们曾经走过的弯路。我这一代人是从jdbc、jsp/servlet、Prototype.js开始编程的,现在的人直接就用Spring、hibernate、jQuery,手快的开始用python\ruby\nodejs。

 

这个类对我的前端开发生涯具有一定标志性意义,是我在前端开发中第一次用OOP思考,放到今天毫不稀奇,甚至有些笨拙,但还是挺宝贵的一次实践。

 

 

//DeductMoney.js
//依赖类库:prototype,buffalo,prototype-window
//服务端需要实现接口:DeductMoneyService
//开发时间:2007-09-04
//作者:tedeyang

/**
 * 通用扣款类;
 * 扣款流程:
 * 1.扣款前首先计算各种扣款明细信息:发送机内码、所属时期和计税金额(或含税金额)给服务端扣款服务接口的DeductMoneyService.calculate()方法.
 * 2.返回明细信息,并用回调函数处理。默认的回调函数弹出一个confirm窗口询问是否真正扣款。
 * 3.如果上一步的回调函数返回true则进行实际扣款:DeductMoneyService.declare:。
 * 4.扣款过程中将出现一个弹出的div层屏蔽用户操作,并每隔一定时间查询扣款状态:DeductMoneyService.queryDeclareState。
 * 5.扣款可能有三种结果:失败,成功,超时.分别对应不同的回调函数(可以覆盖默认实现)
 * 6.如果离开页面或超时,会调用DeductMoneyService.cancel进行取消操作
*/
var DeductMoney = Class.create();
DeductMoney.version = '1.0';

DeductMoney.Default={
	//在得到服务端返回的实际扣款金额后会执行此回调函数.
	//参数reply:即buffalo回调的reply
	//如果该函数返回false则不会进行申报
	afterCalculate : function(reply){
		var success = false;
		if(!reply.isFault()){
			var message = "请确认:\n" +reply.getResult().join("\n");
			message += "\n确定要申报吗?";
			success = window.confirm(message);
		}
		return success;
	},
	//在刷新等待扣款时,如果用户触发了onbeforeunload事件,将执行此函数进行警告.
	unload:function(){return "正在扣款中,现在离开本页面将取消扣款";},
	//扣款失败后会执行此函数,
	//参数result:即buffalo回调的reply.getResult()
	declareFailure:function(result){
		window.alert("扣款失败!失败原因:"+result.description);
	},
	//扣款成功后会执行此函数,
	//参数result:即buffalo回调的reply.getResult()
	declareSuccess:function(result){
		window.alert("扣款成功!");
	},
	//该函数会在超时或用户关闭窗口时执行
	cancel:function(){
		window.alert("本次扣款操作将被取消!");
		Dialog.setInfoMessage("正在取消...");
		this.buffalo.async = false;
		this.buffalo.remoteCall(
			this.serviceName+".cancel",
	 		[this.request_id],
			function(reply){
				DeductMoney.reply = reply;
			}
		);
		if(!DeductMoney.reply.isFault()){
			Dialog.setInfoMessage("已经成功取消了扣款!");
		}else{
			Dialog.setInfoMessage("取消扣款失败!");
		}
	}
};
DeductMoney.reply={isFault:function(){return false;}};//临时存放buffalo返回值.
DeductMoney.prototype = {
	//构造函数
	//buffalo : 将调用的buffalo对象
	//serviceName : 要调用的buffalo服务.该服务必须实现一个接口
	//paramList : buffalo调用的参数列表.应该有三个参数:[机内码,所属时期,金额]
	//optionList :可选,JSON对象,可以覆盖默认的几个参数和回调函数.
	initialize: function(buffalo,serviceName,paramList,optionList){
		this.startTime = 0;     //unit:ms
		this.buffalo = buffalo;
		this.serviceName = serviceName;
		this.paramList = paramList;
		this.replyCallback = {};
		this.optionList = {
			timeout:15,//,超时,秒
			refresh:5,//刷新,秒
			afterCalculate:DeductMoney.Default.afterCalculate,
			whenExitPage:DeductMoney.Default.unload,
			declareFailure:DeductMoney.Default.declareFailure,
			declareSuccess:DeductMoney.Default.declareSuccess,
			cancel:DeductMoney.Default.cancel
		};
		Object.extend(this.optionList, optionList || {});
	},
	_calculate:function(){//预处理。 回调可以为空,这样会调用默认的回调函数
		this.buffalo.async = false;
		this.buffalo.remoteCall(
			this.serviceName+".calculate",
	 		this.paramList,
	 		function(reply){
	 			DeductMoney.reply = reply;
			}
		);
		var success = this.optionList.afterCalculate(DeductMoney.reply);
		if(success){
			this._declare();
		}
	},
	_declare:function(){//申报
		this.buffalo.async = false;
		this.buffalo.remoteCall(
			this.serviceName+".declare",
	 		this.paramList,
			function(reply){
				DeductMoney.reply = reply;
			}
		);
		if(!DeductMoney.reply.isFault()){
			this._wait(DeductMoney.reply.getResult());//查询id指定的扣款请求
		}
	},
	_wait :function (id){
		window.onbeforeunload = this.optionList.whenExitPage;
		window.onunload = this.optionList.cancel.createDelegate(this);
		this.startTime = new Date().getTime();
		Dialog.info("正在扣款中...<br>如果超过"+this.optionList.timeout+"秒还没有成功扣款,该笔扣款将被取消。" ,{className:"alphacube",width: 300, height:120,showProgress:true});
		this.request_id = id;
		this._checkBankKoukuan();
	},
	//循环查询扣款状态
	_checkBankKoukuan :function () {
	  	//查询是否已经扣款,使用ajax同步模式.
	  	//根据
	  	this.buffalo.async = false;
		this.buffalo.remoteCall(
			this.serviceName+".queryDeclareState",
	 		[this.request_id],
			function(reply){
				DeductMoney.reply = reply;
			}
		);
		if(!DeductMoney.reply.isFault()){
			var passedTime = Math.round((new Date().getTime()-this.startTime)/1000);
			var flag = DeductMoney.reply.getResult().code;
			//如果扣款成功了.关闭提示,并调用相应的回调函数
			if(flag=='0000'){//这个代码的意义参见扣款服务为表d_declare打的标记
				window.onbeforeunload = null;
				window.onunload = null;
				this.optionList.declareSuccess(DeductMoney.reply.getResult());
				Dialog.closeInfo();
			}
			//扣款失败,返回了一些失败原因
			else if(!(flag == null) && !(flag == '')){
				window.onbeforeunload = null;
				window.onunload = null;
				this.optionList.declareFailure(DeductMoney.reply.getResult());
				Dialog.closeInfo();
			}
			//超时,向后台发送一个超时标志.
			else if( passedTime > this.optionList.timeout){
				this.optionList.cancel.createDelegate(this)();
				Dialog.closeInfo();
				window.onbeforeunload = null;
				window.onunload = null;
			}
			//扣款还没有成功,也没有返回失败信息,并且尚未超时————继续轮询
			else{
				Dialog.setInfoMessage("正在扣款中,已经等待了"+passedTime+"秒;<br>如果超过"+this.optionList.timeout+"秒还没有成功扣款,该笔扣款将被取消。");
		    	var f = this._checkBankKoukuan.createDelegate(this);
		    	setTimeout(f, this.optionList.refresh * 1000);
			}
		}
	},
	//开始运行,这是唯一需要调用的方法.
	start:function(){
		this._calculate();
	}
};
分享到:
评论

相关推荐

    JavaScript设计与开发新思维(英文原版)

    本书首先回顾了JavaScript的发展历程,从其早期的简单语法到ES6及后续版本的复杂特性,如箭头函数、模板字符串、解构赋值、Promise和Async/Await等。通过这些新特性,开发者可以编写更简洁、更安全的代码。 ### 二...

    javascript 注释代码的几种方法总结

    在编写JavaScript代码时,注释是极其重要的,因为它有助于提高代码的可读性和可维护性,让其他开发者能更容易地理解你的代码。下面我们将详细讨论JavaScript中的两种主要注释方法:单行注释和多行注释。 1. 单行...

    javascript

    在压缩包文件“javascript特效大全.chm”中,可能包含了早期JavaScript特效的实例和教程,涵盖了一些基本特效的实现方法。这些资源对于学习JavaScript的历史和发展,或者了解早期Web开发的实践,都是宝贵的资料。...

    html&js,JavaScript参考手册,css

    而"jquery-1.4.3"和"reference_manual"可能分别代表jQuery的一个旧版本和一个JavaScript的通用参考手册,对于开发者回顾历史版本或查找特定版本的API很有用。 综上所述,这个压缩包是一个全面的Web开发学习资源集合...

    new.riders.press.ppk.on.javascript.sep.2006.rar

    《PPK on JavaScript》是由Peter-Paul Koch(PPK)撰写的一本关于JavaScript的书籍,出版于2006年9月,由New ...对于想要回顾早期JavaScript发展历史或寻找经典教程的开发者来说,这本书籍的电子版是一份宝贵的资源。

    主页特效风神榜450个javascript小程序V2008

    "主页特效风神榜450个javascript小程序V2008"这个资源集合,显然是一份包含大量JavaScript代码示例的宝库,旨在帮助开发者实现各种主页效果,提升用户体验。 1. **JavaScript基础**: 这些小程序涵盖了JavaScript的...

    javascript 5.5 中文

    JavaScript 5.5 是 JavaScript 语言的一个特定版本,尽管现代JavaScript已经发展到了ES6(ECMAScript 2015)及其后续版本,但理解早期版本对于深入学习和历史回顾仍然很重要。JavaScript 是一种广泛应用于网页和网络...

    JSTookit:以前的 javascript 代码或文档的存档

    标题“JSTookit:以前的 javascript 代码或文档的存档”提示我们,JSToolkit 是一个与 JavaScript 相关的工具集,可能是某个开发库或者框架的早期版本,它包含了历史代码和文档,为的是保存过去的技术成果或者供...

    2013年Node.js入门经典源代码

    3. V8引擎:Node.js内部使用Google的V8引擎,能够高效地执行JavaScript代码,提供了接近原生应用的性能。 4. 模块系统:Node.js拥有强大的模块系统,使用`require`函数可以方便地导入和导出模块,实现代码的组织和...

    flash和javascript倒计时时钟

    在压缩包中的“倒计时”文件中,可能包含了Flash源文件(.fla)以及编译后的SWF文件,还有可能包含HTML文件和JavaScript代码,这些文件共同构成了倒计时功能的完整实现。对于开发者来说,分析这些文件可以深入了解...

    JavaScript-v1.0(CHM).rar

    通过阅读这个CHM文档,开发者不仅可以回顾JavaScript的早期面貌,也能深入理解JavaScript语言的核心原理,这对于提升编程技能和解决实际问题非常有帮助。同时,由于CHM文件的特性,查阅和搜索资料也会变得更为方便。

    超经典hao123网址代码ASP.NET

    【超经典hao123网址代码ASP.NET】是一份早期的ASP.NET程序源码,它代表了互联网早期导航网站的构建技术。hao123作为国内知名的网址导航站,其代码对于学习和理解ASP.NET开发具有一定的历史价值和教学意义。在ASP.NET...

    Javascript语言精髓与编程实践(清晰_文字版)_Final

    在“十年JavaScript”章节中,可能回顾了JavaScript的发展历程,从早期的网页脚本语言到现代Web应用的基石,强调了它在互联网发展中的关键角色。书中可能会讨论JavaScript如何从简单的页面特效工具演变为构建复杂...

    javascript5.5chm

    JavaScript 5.5 中文帮助文档是一份详尽的资源,专为学习...对于学习JavaScript的初学者或需要回顾早期版本特性的开发者来说,都是非常宝贵的参考资料。CHM文件的便携性和搜索引擎功能使得快速查找和学习变得更加便捷。

    6个非常精美的Web前端flash+xml焦点图代码(二)

    标题中的“6个非常精美的Web前端flash+xml焦点图代码(二)”指的是这是一个关于Web前端开发的资源,...同时,这也是一种回顾历史的机会,了解在JavaScript框架盛行之前,Web开发者是如何利用Flash技术实现类似功能的。

    HTML、CSS、JavaScript语法简明速查表

    VBScript是Visual Basic Scripting Edition的缩写,主要应用于早期的ASP(Active Server Pages)网页开发中,但它在现代Web开发中的使用已经逐渐减少,被JavaScript所取代。 在HTML、CSS、JavaScript语法简明速查表...

    flash编程源代码 编程源代码

    在IT行业中,Flash编程是一种创建交互式动画、游戏和网页元素的技术,曾广泛应用于网络内容的制作。...本压缩包文件包含了关于Flash编程的源代码...无论你是想回顾历史,还是寻求创新,这份源代码都是一份宝贵的教育资源。

    以前的代码CRM-1

    【标题】:“以前的代码CRM-1”表明这是一个关于旧版客户关系管理系统的代码库,可能是一个早期的项目或者是某个版本的迭代。CRM系统主要用于帮助企业管理和优化与客户之间的交互,提高销售效率和服务质量。 【描述...

    2008年幸福墙源代码

    通过研究这份源代码,开发者不仅可以回顾历史,还能从中汲取经验,理解当时的技术趋势和最佳实践。同时,对于初学者来说,这是一个很好的学习资源,可以了解早期Web开发的整体架构和设计思路。对于有经验的开发者,...

Global site tag (gtag.js) - Google Analytics