同步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可以是:
-
使用相同的旧事件驱动风格。 不是调用嵌套函数,而是为它们发出事件。 但我假设你不会那么喜欢,但至less可以摆脱嵌套的callback。
-
有一个叫做bluebird的npm模块,允许你用promise来扩展现有的模块。 (使用
promisifyAll
)。 因此,承诺仍然会减less代码,你会有比以前使用承诺更清洁的代码。 -
如果你不介意切换框架,你可以试试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,最好去科阿,虽然我已经提到你权衡。