使用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才会真正闪耀.但他们有时会发光,他们值得学习.

相关文章

最后的控制台返回空数组.控制台在ids.map函数完成之前运行va...
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自J...
config.jsconstconfig={base_url_api:"https://douban....
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不...
config.jsconstconfig={base_url_api:"https://douban....
这是我的代码main.cpp:#include<string>#include<...