2015-02-05 88 views
1

我正在为此苦苦挣扎。我想在节点中的数据库驱动模块上构建一个抽象层。如何promisify你自己的JavaScript API使用另一个promisified API与蓝鸟?

var sql = Promise.promisifyAll(require('sql-driver')); 

然后我自己的js文件中我想换行查询,像这样:我已经通过执行以下操作promisified驱动模块

function query(queryString, transaction) { 
    sql.connectAsync(config).then(function() { 

     var req = new sql.Request(transaction); 
     req.queryAsync(queryString).then(function(resultSet)) { 
      console.log(resultSet); 
     }); 
    }); 
} 

我怎样才能promisify(使用蓝鸟),所以我的查询函数也是promisified并返回一个承诺或可以吗?

更新:

我想也可以promisified我的包装方法,使用户能够做这样的事情:

var myDbWrapper = require('my-db-wapper'); 
function getData() { 
    myDbWrapper.startTransaction() 
    .then(function(transaction) { 
     return myDbWrapper.query('select 1 as number', transaction); 
    }) 
    .then(function(resultSet) { 
     console.log(resultSet); 
    }). 
    .catch(function(e) { 
     console.error(e); 
    }); 
} 

我敢肯定,这是行不通的代码,只需试图传达这个想法。此外,此示例仅显示一个查询,并且不显示提交方法,该方法也是包装的一部分。有人能告诉我一个例子,使用承诺做一个以上的查询的整个交易,然后如果没有错误,则提交'提交'?

更新2:

idbehold的下面的例子不会让我做这种类型的事情假设我们不会在这个时候关心交易,只是一个简单的查询:

myDbWrapper.query(queryString, undefined) 
.then(function(recordSet) { 
    console.log(recordSet); 
}) 
.catch(function(err) { 
    console.error(err); 
}); 

如何启用我的查询方法以这种方式工作?

更新3:

我发现我的答案。见下文。

+2

你不需要“promisify”,你只需要“返回”你已经使用的承诺。 – Bergi 2015-02-05 20:12:00

+0

正如bergi所说 - 承诺通过返回值工作 - 如果你希望你的函数被“promisified”只是简单的回复一个承诺 - 这就是所需要的。 – 2015-02-05 20:18:33

+0

您的'getData'仍然不是'return' myDbWrapper.startTransaction – 2015-02-05 20:53:12

回答

4

刚刚返回承诺:

function query(queryString, transaction) { 
    return sql.connectAsync(config).then(function() { 
     var req = new sql.Request(transaction); 
     return req.queryAsync(queryString); 
    }).then(function(resultSet)) {  // You don't actually 
     console.log(resultSet);   // need this this part 
     return resultSet;     // unless you need to log 
    }); 
} 
+0

但我希望我的包装也是promisified以及。这个例子是返回一个字符串给查询的调用者。 – u84six 2015-02-05 20:23:23

+0

@ u84six调用此函数将返回一个承诺。 – idbehold 2015-02-05 20:32:25

+0

所以你能告诉我如何在我的更新的例子中使用查询方法和startTransaction方法? – u84six 2015-02-05 20:44:11

0

好吧,我想通了,它在我的面前是正确的。这是我对Promises的理解不够。大多数的反应是关于返回承诺正确的,但是,我需要建立一个新的承诺一样,所以我不应该回到我使用的承诺:

function query (queryString, transaction) { 
    return new Promise(function(resolve, reject) { 
     var req = new sql.Request(transaction); 
     req.queryAsync(queryString).then(function(resultSet) { 
      resolve(resultSet); 
     }) 
     .catch(function(err) { 
      reject(err); 
     }); 
    }); 
} 

编辑,而无需创建一个新的承诺:

function query (queryString, transaction) { 
    var req = new sql.Request(transaction); 
    return req.queryAsync(queryString); 
} 
+0

你不需要那样做。在另一个包装中现有的承诺除了增加内存使用量和代码行外无所作为。 – idbehold 2015-02-06 20:04:16

+0

我无法让你的例子工作。你能给我一个如何在你的例子中使用查询方法的例子吗? – u84six 2015-02-06 20:07:08

+1

我编辑了你的帖子,向你展示了等价的功能,而没有创建一个新的承诺。 – idbehold 2015-02-06 20:09:47