使用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的异步特性,我需要返回一个promise。我无法编写像python这样的node.js代码。如何转换getLastRecord()为返回承诺,以及如何处理返回的值?

实际上,我想做的就是这样。

if (getLastRecord() > 20)
{
    console.log("action");
}

如何以可读的方式在node.js中完成此操作?

我想看看在这种情况下如何使用bluebird来实现诺言。

乔什·霍尔布鲁克(Josh Holbrook)

这会有点分散,请原谅我。

首先,假设此代码正确使用了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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Node.js中的Promise(Bluebird)返回值

来自分类Dev

Node.js-MySQL查询的返回值

来自分类Dev

从Node.js中的异步函数返回值

来自分类Dev

如何从 node.js 中的异步函数返回值

来自分类Dev

使用Promise处理Node.js + Express中的错误

来自分类Dev

无法从 Promise 函数 Node.js 返回值

来自分类Dev

Observable 中的 Promise 不返回值

来自分类Dev

在 promise.then 中返回值

来自分类Dev

返回值方法中的异常处理

来自分类Dev

处理JavaScript中的多个返回值

来自分类Dev

从Promise返回值

来自分类Dev

使用node.js检查返回值以逗号分隔

来自分类Dev

从MySQL查询Node-RED的msg.payload返回值中获取值

来自分类Dev

从node.js和mongoose中的回调返回值

来自分类Dev

如何知道Node.js中的文件位置?-lseek的返回值

来自分类Dev

如何在Node.js中从外部引用函数的返回值

来自分类Dev

当我在node.js中调用ajax作为未定义的返回值时

来自分类Dev

是否可以从 node.js 中的异步函数返回值?

来自分类Dev

Node.JS-Node-PowerShell返回值

来自分类Dev

是否可以从promise通知回调中返回值?

来自分类Dev

AngularJS-工厂中的Promise ID字段的返回值

来自分类Dev

Angular 2 Pipe-无法在Promise中返回值

来自分类Dev

是否可以从promise通知回调中返回值?

来自分类Dev

AngularJS-工厂中的Promise ID字段的返回值

来自分类Dev

Angular 2 Pipe-无法在Promise中返回值

来自分类Dev

获取 Promise 中单个函数的返回值

来自分类Dev

从node.js文件向shell脚本返回值

来自分类Dev

Node.js-SQL函数不返回值

来自分类Dev

从管道读取:如何处理c中的返回值?