关于诺言,要记住的关键是
then返回一个新的诺言
(与一样
catch)。新诺言的结算方式取决于您从处理程序返回的内容:如果您返回诺言,则来自
then/
的新诺言将成为您返回的诺言的
catch奴隶;如果您返回一个值,则使用该值来解析新的promise。
因此,您可以将它们链接在一起。将
then和
catch处理程序视为最终结果流经的转换过滤器。
还要注意,如果您有一个给您诺言(
cn.connect())的起点,则不需要
newPromise:只需使用
then和
catch通过返回(新)分辨率值来变换通过链的内容。
要记住的另一项关键是,如果
catch处理程序返回一个值,它将把拒绝转换为分辨率。要继续沿拒绝路径前进,
catch处理程序必须抛出异常或返回将被/将被拒绝的承诺。
最后:
require调用应始终位于模块的开头。
因此,无需删除拒绝项到解决方案的转换(稍后会介绍更多内容):
var sql = require('mssql');var myDao = require('./myDao');module.exports = { dbConnection: function () { return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' }; }, CanIConnectToTheDB: function () { var cn = new sql.ConnectionPool(myDao.dbConnection()); return cn.connect() .then(function () { var req = new sql.Request(cn); var qry = 'select serverproperty('productversion') as 'rs''; return req.query(qry) .then(function (rs) { qry = 'select isnull(object_id('SomeObjectIKnowExists'), -1)'; return req.query(qry) .then(function (rss) { // Note you're not using rss anywhere return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS'; }) .catch(function (err) { return ' CONNECTED// MASTER DB SUCCESS// ISSUE QUERYING MY DB //' + err + '//'; }); }) .catch(function (er) { return ' CONNECTED// COULD NOT QUERY MASTER DB //' + er + '//'; }); }) .catch(function() { return ' CAN NOT CONNECT'; }); }};
注意:我的意图是在此处不使用rej [ect]。您看到的保证只有res
[olve]返回。这意味着返回到的代码仅需要一个路径来处理返回的值。这样,返回的代码就更简单了。
出于某种原因,拒绝遵循与决议不同的路径。它不会使事情变得更复杂,而是使事情变得 更简单
。除非您进行了某种类型的错误恢复,并且可以继续进行,好像拒绝没有发生,否则请不要将拒绝转换为解决方案。
这是允许拒绝成为拒绝的代码:
var sql = require('mssql');var myDao = require('./myDao');module.exports = { dbConnection: function () { return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' }; }, CanIConnectToTheDB: function () { var cn = new sql.ConnectionPool(myDao.dbConnection()); return cn.connect() .then(function () { var req = new sql.Request(cn); var qry = 'select serverproperty('productversion') as 'rs''; return req.query(qry) .then(function (rs) { qry = 'select isnull(object_id('SomeObjectIKnowExists'), -1)'; return req.query(qry) .then(function (rss) { // Note you're not using rss anywhere return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS'; }); }); }); }};
使用它:
theModule.CanIConnectToTheDB() .then(function() { // Yes, let's do something }) .catch(function() { // No, report the problem, etc. });
我可能还会抽象出我认为您将一遍又一遍地做的事情:建立连接并从中获取请求对象:
var sql = require('mssql');var myDao = require('./myDao');function getRequest() { var cn = new sql.ConnectionPool(myDao.dbConnection()); return cn.connect().then(function() { return new sql.Request(cn); });}module.exports = { dbConnection: function () { return { user: 'sa', password: 'mypassword', server: 'localhost', database: 'mydb' }; }, CanIConnectToTheDB: function () { return getRequest().then(function(req) { var qry = 'select serverproperty('productversion') as 'rs''; return req.query(qry) .then(function (rs) { qry = 'select isnull(object_id('SomeObjectIKnowExists'), -1)'; return req.query(qry) .then(function (rss) { // Note you're not using rss anywhere return ' CONNECTED// MASTER DB SUCCESS// MY DB SUCCESS'; }); }); }); }};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)