Skip to content

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

--> -->

  • 文章目录

    • 什么是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') })