【问题标题】:synchronous sqlite transactions node同步 sqlite 事务节点
【发布时间】:2014-09-06 15:57:58
【问题描述】:

我用 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(middleware) 返回和错误“Object # has no method .then() 任何人都知道我做错了什么

【问题讨论】:

标签: node.js sqlite


【解决方案1】:

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

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

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

  2. 有一个名为 bluebird 的 npm 模块允许您使用 Promise 扩展现有模块。 (使用promisifyAll)。因此,promise 仍然会精简代码,并且您将拥有比使用 promise 之前更简洁的代码。

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

所以上面的代码可以改写成这样:

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

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

如果只有少数地方需要做这种事情,我会推荐使用 bluebird,但如果你厌倦了代码中的大量回调,最好选择 Koa,尽管我已经已经向您提到了权衡。

【讨论】:

  • 使用bluebird我可以在函数中嵌套一个promise()而不是promisify all。 (我想保持我的插入和删除异步)
  • 是的,你可以。我只是简要说明了如何解决问题。 Bluebird 的设计主要是为了将回调转换为 Promise。
  • 所以我尝试使用 promisifyAll(require('sqlite3')) 和 promisifyAll(new sqlite3.Database(file)) 都不起作用
  • 尝试阅读此github.com/petkaantonov/bluebird/blob/master/… 还请记住,一旦您需要使用 Promisies 来调用带有 Async 后缀的函数
  • 那是我的问题我没有添加 Asyc 后缀...大声笑这可能很愚蠢有没有办法让价值脱离承诺(这仍然比回调更容易,只是好奇我是否可以让它更容易)这会返回一个承诺,但会驱动我的观点 var i = fnAsync().then() 是否有办法返回一个值,可能使用 resolve 或其他东西......我想我不明白解决点
猜你喜欢
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多