如何从Node.js中的异步函数获取返回值?

时间:2014-04-03 16:46:19

标签: javascript node.js express

我想从这个异步函数exports.getServices中获取一个返回值。但是我什么也没得到/ null。

        var http = require("http");
        var mysql = require('mysql');
        var url = require("url");

        var connection = mysql.createConnection({
        ...
        });

        connection.connect();

        exports.getServices = function (){
            connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
                if (err) throw err;
                var services = new Array();
                for (var i in rows) {
                    services[i] = rows[i].SERVICE;
                }
                return services;
            });
        }

我从另一个模块访问此方法:

var express = require('express');
var hbs = require('express3-handlebars');

var app = express();
app.engine('html', hbs({defaultLayout: 'layout'}));
app.set('view engine', 'html');
app.set('views', __dirname + '\\views');
app.use(express.bodyParser());

var mysql = require('./mysql');

app.get('/', function(req, res) {
    res.render('index',{title:"Services", services:mysql.getServices()});
});

app.get('/article/:id', function(req, res) {
    var entry = blogEngine.getBlogEntry(req.params.id);
    res.render('article',{title:entry.title, blog:entry});
});

app.listen(3000);

如果您可以发布更正的代码,那将非常有用。非常感谢你提前!

1 个答案:

答案 0 :(得分:3)

您未提供有关哪个模块实施connection的任何信息。此外,您还没有完全清楚哪个函数[getServices()或传递给query()的回调函数]没有返回任何内容。但是,我仍会尝试回答你的问题。

  1. getServices()函数永远不会返回任何内容 - 它只调用query()。所以,显然,你不能期望得到这样的结果:

    var result = getServices(...);

  2. 回调函数确实返回一个值,但由于它是调用它的query()函数,因此无法获得该返回值。此外,query()可能无视任何返回值。

  3. 要解决此问题,您需要传递给getServices()您自己的回调函数以接收结果。所以,你的实现看起来应该更像这样:

    connection.connect();
    
    exports.getServices = function (next) {
        connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
            if (err) throw err;
            var services = new Array();
            for (var i in rows) {
                services[i] = rows[i].SERVICE;
            }
            next(services);
        });
    }
    

    但是,您应该弄清楚是否抛出错误(在原始回调中,当出现错误时)会导致问题(例如导致服务器崩溃)。您可能想要做其他事情:

    connection.connect();
    
    exports.getServices = function (next) {
        connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) {
            if (err) return next(err); // Pass err to next, and immediately return.
            var services = new Array();
            for (var i in rows) {
                services[i] = rows[i].SERVICE;
            }
            next(null, services); // Pass result to next (with no error).
        });
    }
    

    欢迎来到异步函数式编程世界!

相关问题