node.js〜构建Promise解决方案的链式序列

node.js〜构建Promise解决方案的链式序列,第1张

node.js〜构建Promise解决方案的链式序列

关于诺言,要记住的关键是

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';  });     });        });    }};


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5172713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存