levelDB 数据操作接口 实现 promise 规范
文章目录
什么是levelDB
google 公司开发的一款 高性能KV型nosql数据库 ,你可以点击链接查看以前的介绍.
node.js 下使用leveldb 请移步到这里.
但是之前的所有leveldb 操作接口都是基于 callback 回调.所以今天这篇就是分享下leveldb 数据接口实现promise 规范.
什么是promise
请移步到上面的博文查看
levelup
levelup 是 leveldb 在node.js 上的实现开源包.
github地址: https://github.com/Level/levelup
提供的接口
- levelup()
- db.open()
- db.close()
- db.put()
- db.get()
- db.del()
- db.batch() (array form)
- db.batch() (chained form)
- db.isOpen()
- db.isClosed()
- db.createReadStream()
- db.createKeyStream()
- db.createValueStream()
我们用 db.put() 和 db.get() 来举例说明
db.put()
插入一条记录,参数 key ,value
db.put(key,value,function(error){
if(!error){
db.get(key,function(error,value){
console.log(error,value);
});
}
});
上面我们看到调用 put ,get 方法,除了前面的参数,紧接着后面有一个回调函数 function(error){ ... }
当执行到回调函数时,我们才得到结果,然后执行下一步.
如果我们并行执行10多个这样的方法,那么杂乱无章的 callback 回调嵌套会彻底让你眼花缭乱,维护的时候更是噩梦
fun1(function(result){
fun2(function(result){
fun3(function(result){
fun4(function(result){
..........
});
});
});
});
promise 实现
就比如上面的这几个并行顺序执行的方法,我们用 promise 来改下后,调用顺序应该是这样的
fun1()
.then( return fun2() )
.then(return fun3() )
.then (return fun4() )
.then(function(result){
//结果
}).catch(function(error){
//任何一部出错,都会被此函数拦截
});
上面的调用方式是不是看起来更有调理,一步一步顺序执行,维护起来也很方便呢.
包装一个 pormise 规范接口
我们还是以 db.put 方法为例
我们要使用一个开源包 q
promise规范开源包q的使用
请移步到上面的博文查看 q 的使用.
var Q=require('q');
function option_put(key,value){
var defer=Q.defer();
db.put(key,value,function(error){
if(!error){
defer.resolve('success');
}else{
defer.reject(error);
}
});
return defer.promise;
}
上面我们定义了一个方法 option_put ,然后方法里通过 q 开源包实现了一个 promise 规范.下面我们调用这个方法
option_put('blog','yijiebuyi.com')
.then(function(result){
//调用成功
},function(error){
//调用失败
})
上面的then 方法中定义了2个 function ,分别来接收 promise 规范 返回值的正确/错误 状态.
那么 levelUP 中其他的方法也是这样包装一遍....
巧的是,已经有人做了这样的事,就不需要自己造轮子了
q-level
q-level 是用 Q 包装的 levelup 接口
github地址:https://github.com/mvayngrib/q-level
安装:
npm install --save q-level
调用:
引用官网的例子
var level = require('level')
var promisify = require('q-level')
var db = promisify(level('my.db', { valueEncoding: 'json' }))
var contents = {}
db.put('a', 1)
.then(function() {
return db.batch([
{ type: 'put', key: 'b', value: 2 },
{ type: 'put', key: 'c', value: 3 }
])
})
.then(function() {
return db.createReadStream()
})
.progress(function(data) {
contents[data.key] = data.value
})
.catch(function(err) {
console.log('Error reading stream', err)
})
.then(function() {
console.log('Contents:', contents)
return db.close()
})
.done(function() {
console.log('Closed')
})