NodeJS Promise行为查询

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

//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来允许执行查询。 一旦完成,如果它的错误,我想“undefined”返回其他正确的结果返回给调用者。

根据我的理解,履行和拒绝callback决定了Promise的命运。 调用堆栈中最顶层的是函数query_mssql()。 我的假设是,一旦我呼吁“履行”,如果成功或返回履行()结果如果错误是空的。

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

函数computeCurrentDefinitionResult()是出现所有问题的地方。 我需要做一个接一个的两个SQL查询。 但是,如果第一个查询失败,那么我看不到任何处理下一个查询的意思

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

如果LeafNode是未定义的,我不希望其余的被执行,因为它没有意义。 我想把LeafNode的值返回给调用者。 但是,如果我返回的履行(),代码stream似乎移动到下一个。 如果我使用reject(),则调用者query_mcafee_mssql_type().then块不会被调用。 相关的块显示如下。

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

– 我怎样才能返回computeCurrentDefinitionResult()的实际结果? – 所有的function是否需要返回“Promise”来实现我所做的? – 为什么在调用“fulfill()”之后代码补丁不能从函数中返回? – 在这些function块中是否需要使用“返回”? 任何帮助,将不胜感激。 谢谢。

从你的代码中,我有一种感觉,你不知道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); });