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

leveldb.png

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

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



回到顶部