IDB如何写出稳健的代码 稳健的回调方式
如何写出稳健的代码
稳健的回调方式
IDB在技术上最大的特点,就是异步操作比较多,我先举几个例子,
例1:打开数据库
var request = window.indexedDB.open( '数据库名', 1 ); // 1为数据库版本号
request.onsuccess = function( event ){ }
request.onerror = function( event ){ }
例2:移除数据库
var request = window.deleteDatabase.deleteDatabase( '数据库名' );
request.onsuccess = function( event ){ }
request.onerror = function( event ){ }
例3:根据主键获取记录
var tb = db.transaction( '数据表名' ).objectStore( '数据表名' );
tb.get( '主键值' ).onsuccess = function( event ) { }
tb.get( '主键值' ).onerror = function( event ) { }
通过上面的例子,我们知道IDB是基于事件的,几乎所有IDB操作都涉及到两个回调函数,一个是操作成功之后回调,一个是操作失败之后回调。 上面的代码书写,容易理解,但并不稳健,只适合用于展示。不稳健体现在兼容性上,以上代码在Firefox上运行良好,但在Chrome上运行会出现没响应的情况,原因是错过了捕获事件的时机,导致两个回调函数都没有被执行,那么如何解决?我在网上阅读了一篇印度人写的关于IDB文章(中文版),我借鉴了他的一小段代码,很好地解决这个问题。代码如下:
Utils = {
errorHandler: function( err_callback ) {
return function( event ) {
if( err_callback ) {
err_callback( event );
} else {
throw new Error( '没有定义出错时的回调函数' );
}
};
}
,request: function ( req, callback, err_callback ) {
var self = this;
if ( callback ) {
req.onsuccess = function ( event ) {
callback( event );
};
}
req.onerror = self.errorHandler( err_callback );
}
};
有了这段代码,上面的例子1可以改写为:
Utils.request(
request = window.indexedDB.open( '数据库名', 数据库版本号 )
,function( event ){ console.log( 'success' ); }
,function( event ){ console.log( 'fail' ); }
);
其余的例子同理,不再列举。这样写除了避免错过捕获事件的时机以外,对回调的处理也算是一种简化,不用再重复写onsuccess ,onerror 这些烦人的东西,你只需要记住Utils.request的第二个参数是成功后的回调,第三个参数是失败后的回调即可,如你觉得不需要设置失败后的回调,你只需要将第三个参数设置为null即可。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5075.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
