跳到主要内容

levelDB 数据操作接口 实现 promise 规范

· 阅读需 3 分钟
一介布衣
全栈开发者 / 技术写作者
  • 文章目录
  • 什么是promise

  • levelup

  • db.put()

  • promise 实现

  • 包装一个 pormise 规范接口

  • q-level

  • 什么是levelDB

  • google 公司开发的一款 高性能KV型nosql数据库 ,你可以点击链接查看以前的介绍.

  • node.js 下使用leveldb 请移步到这里.

  • 但是之前的所有leveldb 操作接口都是基于 callback 回调.所以今天这篇就是分享下leveldb 数据接口实现promise 规范.

  • 什么是promise

promise 规范让javascript拜托callback回调

请移步到上面的博文查看

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') })