我用npm
安装了sqlite3npm 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()任何人都知道我做错了什么
答案 0 :(得分:2)
我在使用Express时遇到过这样的问题以及许多其他问题,它让我疯狂,我无法避免回调地狱。
一些可能的解决方案可以是:
使用相同的旧事件驱动样式。而不是调用嵌套函数,为它们发出事件。但是我假设你不会那么喜欢,但至少可以摆脱嵌套的回调。
有一个名为bluebird的npm模块,允许您使用promises扩展现有模块。 (使用promisifyAll
)。因此,承诺仍将减少代码,你将拥有比使用promises之前更清晰的代码。
如果你不介意切换框架,你可以试试KoaJS,它允许你使用生成器函数(另一个很酷的特性)产生(来自ECS 6的有趣的东西)函数。您可以阅读更多有关此here。
所以上面的代码可以重写为:
var rows = yield db.each() //or something like that
这是一个了不起的功能,但缺点是你必须使用不稳定版本的节点(0.11.x)。我们还遇到了一些使用0.11.x设置https并且不得不降级到0.10.x的问题(我们也没有使用koa)
如果只有少数地方你需要做这样的事情,我建议使用蓝鸟,但是如果你厌倦了在你的代码中有很多回调,那么最好去Koa,尽管我已经已经提到你的权衡。