同步sqlite事务节点

我用npm安装了sqlite3

npm install sqlite3 --save 

我写了一些基本的function,我想同步执行,而不是asynchronous。

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

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

 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是后来暴露的对象,但是Id喜欢返回值

 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

我已经实施了蓝鸟,但Promise.promisifyAll(中间件)返回和错误“对象#没有方法。然后()任何人都知道我做错了什么

在使用Express的时候,我碰到过类似这样的问题,还有其他许多问题,这让我疯狂,因为我无法避免回拨地狱。

一些可能的解决scheme可以是:

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

  2. 有一个叫做bluebird的npm模块,允许你用promise来扩展现有的模块。 (使用promisifyAll )。 因此,承诺仍然会减less代码,你会有比以前使用承诺更清洁的代码。

  3. 如果你不介意切换框架,你可以试试KoaJS ,它允许你使用生成器函数(另一个很酷的特性)产生(从ECS 6中获得有趣的东西)函数。 你可以在这里阅读更多。

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

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

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

如果只有几个地方你需要做这样的事情,我会build议使用蓝鸟,但如果你厌倦了在你的代码中有很多callback,最好去科阿,虽然我已经提到你权衡。