同步sqlite事务节点

时间:2014-09-06 15:57:58

标签: node.js sqlite

我用npm

安装了sqlite3
npm install sqlite3 --save

我已经编写了一些基本功能,我想要同步执行,而不是使用异步。

例如,我想在一个函数中获取列名,在另一个函数中获取行计数。

我想简单地返回这些值。目前我正在使用像这样的回调

d.cinfo = function(table, callback){
    var o = {};
    db.each("PRAGMA table_info(" + table + ")", function(err, col){
        o[col.name] = col.type;
    }, function(){
        if(typeof callback == 'function') callback(o);
    });
}

d是稍后曝光的对象 但是我想返回值

d.cinfo = function(table, callback){
    var o = {};
    db.each("PRAGMA table_info(" + table + ")", function(err, col){
        o[col.name] = col.type;
    }, function(){
        return o;
    });
}

有没有办法实现这一目标。我发现文件说这是可能的,但后来我才知道它已经过时了,我不确定它对同一个api意味着什么

我已经实现了bluebird但是Promise.promisifyAll(中间件)返回并且错误"对象#没有方法.then()任何人都知道我做错了什么

1 个答案:

答案 0 :(得分:2)

我在使用Express时遇到过这样的问题以及许多其他问题,它让我疯狂,我无法避免回调地狱。

一些可能的解决方案可以是:

  1. 使用相同的旧事件驱动样式。而不是调用嵌套函数,为它们发出事件。但是我假设你不会那么喜欢,但至少可以摆脱嵌套的回调。

  2. 有一个名为bluebird的npm模块,允许您使用promises扩展现有模块。 (使用promisifyAll)。因此,承诺仍将减少代码,你将拥有比使用promises之前更清晰的代码。

  3. 如果你不介意切换框架,你可以试试KoaJS,它允许你使用生成器函数(另一个很酷的特性)产生(来自ECS 6的有趣的东西)函数。您可以阅读更多有关此here

  4. 的内容

    所以上面的代码可以重写为:

    var rows = yield db.each() //or something like that
    

    这是一个了不起的功能,但缺点是你必须使用不稳定版本的节点(0.11.x)。我们还遇到了一些使用0.11.x设置https并且不得不降级到0.10.x的问题(我们也没有使用koa)

    如果只有少数地方你需要做这样的事情,我建议使用蓝鸟,但是如果你厌倦了在你的代码中有很多回调,那么最好去Koa,尽管我已经已经提到你的权衡。