我正在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”,如果成功则返回结果,如果错误则返回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 值返回给其调用者。但是,如果我返回fulfill(),代码流似乎会移至下一个.then。如果我使用reject(),则调用者query_mcafee_mssql_type() .then block 不会被调用。相关 block 如下所示。
computeCurrentDefinitionResult(database, node_name)
.then(function (result) {
console.log('query_mcafee_mssql_type' + result);
fulfill(result);
});
- 如何从computeCurrentDefinitionResult() 返回实际结果? - 是否所有函数都需要返回“Promise”才能实现我正在做的事情? - 为什么调用“fulfill()”后代码补丁没有从函数返回? - 这些功能 block 中是否需要使用“return”? 任何帮助,将不胜感激。谢谢。
最佳答案
从你的代码中,我感觉你不知道 Promise 中 resolve
和 reject
的正确用法。这是正确的。
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);
});
关于javascript - NodeJS Promise 行为查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29765650/