使用promise在node.js中处理MySQL返回值
作者:互联网
我有一个python背景,目前正在迁移到node.js.由于其异步性质,我有问题调整到node.js.
例如,我试图从MySQL函数返回一个值.
function getLastRecord(name)
{
var connection = getMySQL_connection();
var query_str =
"SELECT name, " +
"FROM records " +
"WHERE (name = ?) " +
"LIMIT 1 ";
var query_var = [name];
var query = connection.query(query_str, query_var, function (err, rows, fields) {
//if (err) throw err;
if (err) {
//throw err;
console.log(err);
logger.info(err);
}
else {
//console.log(rows);
return rows;
}
}); //var query = connection.query(query_str, function (err, rows, fields) {
}
var rows = getLastRecord('name_record');
console.log(rows);
经过一些阅读,我意识到上面的代码无法工作,我需要返回一个由于node.js异步性质的承诺.我不能像python一样编写node.js代码.如何转换getLastRecord()以返回一个promise以及如何处理返回的值?
事实上,我想做的就是这样;
if (getLastRecord() > 20)
{
console.log("action");
}
如何以可读的方式在node.js中完成?
我想看看在这种情况下如何使用bluebird实现promises.
解决方法:
这会有点分散,请原谅我.
首先,假设此代码正确使用了mysql驱动程序API,这里有一种方法可以将其包装为使用本机承诺:
function getLastRecord(name)
{
return new Promise(function(resolve, reject) {
// The Promise constructor should catch any errors thrown on
// this tick. Alternately, try/catch and reject(err) on catch.
var connection = getMySQL_connection();
var query_str =
"SELECT name, " +
"FROM records " +
"WHERE (name = ?) " +
"LIMIT 1 ";
var query_var = [name];
connection.query(query_str, query_var, function (err, rows, fields) {
// Call reject on error states,
// call resolve with results
if (err) {
return reject(err);
}
resolve(rows);
});
});
}
getLastRecord('name_record').then(function(rows) {
// now you have your rows, you can see if there are <20 of them
}).catch((err) => setImmediate(() => { throw err; })); // Throw async to escape the promise chain
所以有一点:你还有回调.回调函数只是函数,您可以通过其选择的参数在将来某个时候调用某些函数.因此,xs.map(fn)中的函数参数,节点中看到的(错误,结果)函数以及promise结果和错误处理程序都是回调函数.这有点让人感到困惑的是人们将特定类型的回调称为“回调”,节点核心中使用的(错误,结果)所谓的“延续传递风格”,有时被称为“节点反馈”的人真的很喜欢他们.
现在,至少(async / await最终会到来),无论你是否采用承诺,你几乎都会遇到回调.
此外,我会注意到承诺不是立即的,显然在这里很有帮助,因为你仍然有回调.当你将它们与Promise.all结合起来并且承诺累加器和Array.prototype.reduce时,Promise才会真正闪耀.但他们有时会发光,他们值得学习.
标签:mysql,node-js,asynchronous,promise,node-mysql 来源: https://codeday.me/bug/20190928/1827226.html