我有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的异步特性,我需要返回一个promise。我无法编写像python这样的node.js代码。如何转换getLastRecord()
为返回承诺,以及如何处理返回的值?
实际上,我想做的就是这样。
if (getLastRecord() > 20)
{
console.log("action");
}
如何以可读的方式在node.js中完成此操作?
我想看看在这种情况下如何使用bluebird来实现诺言。
这会有点分散,请原谅我。
首先,假设此代码正确使用了mysql驱动程序API,这是将其包装为与本机promise一起使用的一种方法:
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)
,(err, result)
在节点中看到的函数以及promise结果和错误处理程序都是回调。人们将一种特定的回调称为“回调”,这在某种程度上使人感到困惑,这种回调(err, result)
在节点核心中以“连续传递样式”的形式使用,有时被不喜欢它们的人称为“ nodebacks”。
到目前为止,至少(异步/等待最终会出现),无论是否采用Promise,您都几乎陷入了回调。
另外,我会注意到,promise不会立即生效,显然在这里很有用,因为您仍有回调函数。当您将它们与Promise.all
并保证累加器结合时,承诺才真正闪耀Array.prototype.reduce
。但他们做的光泽有时,他们是值得学习的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句