繁体   English   中英

NodeJS Promise行为查询

[英]NodeJS Promise behaviour query

我在nodejs中尝试Promise,以更好地了解其工作原理。 我有部分工作代码,但是不确定是否正确使用了它。 我的意图是将错误或正确的结果传递回调用方函数。 所有这些回调似乎都变得很复杂。 这是我到目前为止所拥有的。

//This is my main CALLER function
function query_mcafee_mssql_type(database, node_name, type) {
  return new Promise(function (fulfill, reject) {
    switch (type) {
      case "currentDefinitionDate":
          computeCurrentDefinitionResult(database, node_name)
          .then(function (result) {
            console.log('query_mcafee_mssql_type' + result);
            fulfill(result);
          });
          break;
    }
  });
}

function computeCurrentDefinitionResult(database, node_name) {

  return new Promise(function (fulfill, reject) {
    var leaf_sql_query = "SELECT * FROM "+  JSON.stringify(database)  +".dbo.EPOLeafNode WHERE NodeName=" + "'" + node_name + "'";
    query_mcafee_mssql(leaf_sql_query)
    .then(function (LeafNode) {
         if (LeafNode == undefined) {
          fulfill(LeafNode);
         } else {
          return LeafNode;
         }
    })
    .then(function (LeafNode) {
      console.log('computeCurrentDefinitionResult' + LeafNode);
      var product_properties_sql_query = "SELECT * FROM "+  JSON.stringify(database)  +".dbo.EPOProductProperties WHERE ParentID=" + "'" + LeafNode.AutoID + "'" + "AND ProductCode LIKE 'VIRUSCAN%'";
      return query_mcafee_mssql(product_properties_sql_query);
    })
    .then(function (ProductProperty) {
      if (ProductProperty == undefined) {
          fulfill(ProductProperty);
      } else {
          return ProductProperty;
      }
    })
    .then(function (ProductProperty) {
      fulfill(ProductProperty.DATDate);
    });
  });
}

function query_mcafee_mssql(sql_string) {
  return new Promise(function (fulfill, reject) {
    query_mssql(mcafee_config, sql_string)
    .then(function (sql_response) {
      fulfill(sql_response);
      console.log('query_mcafee' + sql_response);
    });
  });
}

function query_mssql(config, sql_string){
  return new Promise(function (fulfill, reject) {
    var connection = new sql.Connection(config, function(err) {
      // ... error checks 
      if (err) {
        console.log('connection to mssql has failed');
        //throw err;
        fulfill();
      } else {
        // Query 
        var request = new sql.Request(connection); 
        request.query(sql_string, function(err, recordset) {
          // ... error checks should go here :
          if (err) {
            console.log('requst query error');
            fulfill();
          } else {
            // output query result to console:
            //console.log(recordset);
            fulfill(recordset);
         }
        });
      } 
    });
  });
}

我的主要调用函数是query_mcafee_mssql_type()。 我使用Promise允许执行查询。 一旦完成,如果出现错误,我希望“未定义”返回,否则将正确的结果返回给调用方。

根据我的理解,实现和拒绝回调决定了Promise的命运。 调用堆栈中最上面的是函数query_mssql()。 我的假设是,一旦成功调用结果就调用“ fulfill”,如果出错则返回满值()。

上面的函数是query_mcafee_mssql(),它忽略错误或成功,只是传递结果。

发生所有问题的地方是computeCurrentDefinitionResult()函数。 我需要一个接一个地进行两个sql查询。 但是,如果第一个查询失败,那么在进行下一个查询时我看不到任何意义

query_mcafee_mssql(leaf_sql_query)
        .then(function (LeafNode) {
             if (LeafNode == undefined) {
              fulfill(LeafNode);
             } else {
              return LeafNode;
             }
        })

我不希望执行.then的其余部分,因为如果未定义LeafNode则没有意义。 我想将LeafNode的值返回给它的调用者。 但是,如果返回return(),则代码流似乎移至next .then。 如果我使用exclude(),则调用方query_mcafee_mssql_type()。然后不会调用该块。 相关块如下所示。

computeCurrentDefinitionResult(database, node_name)
              .then(function (result) {
                console.log('query_mcafee_mssql_type' + result);
                fulfill(result);
              });

-如何从computeCurrentDefinitionResult()返回实际结果? -是否所有功能都需要返回“ Promise”以实现我正在做什么? -为什么在调用“ fulfill()”后代码补丁未从函数返回? -在这些功能块中是否需要使用“返回”? 任何帮助,将不胜感激。 谢谢。

从您的代码中,我感觉到您不了解Promise中正确使用resolvereject想法。 这是正确的。

function query_mssql(config, sql_string){
  return new Promise(function (resolve, reject) {
    var connection = new sql.Connection(config, function(err) {
      // ... error checks 
      if (err) {
        return reject(err);
      }
      // Query 
      var request = new sql.Request(connection); 
      request.query(sql_string, function(err, recordset) {
        // ... error checks should go here :
        if (err) {
            return reject(er);
        }
        // output query result to console:
        //console.log(recordset);
        resolve(recordset);
      });
    });
  });
}
//Then use it like this
query_mssql(config,sql_string)
.then(function(LeafNode){
    //query success
    console.log(LeafNode);
}).catch(function(er){
    //query failed,
    console.log(er);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM