异步功能不运行

时间:2016-03-21 15:31:04

标签: javascript node.js asynchronous

这是nodejs app上下文中的控制器内容:

 var express = require('express'),
    directory_router = express.Router(),
    directory_models = require('./directory_models');

directory_router.get('/list', function(req, res) {
    var data = directory_models.read_result(function (err, data) {
        console.log(data); // Need returned data here, but won't run
        res.send(data); // Same
    });
// If I try to access 'data' here it's empty
});

module.exports = directory_router;

以下是返回数据库中提取的数据的模型:

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

var read = function() {
    var read_result;

    settings.pg.connect(settings.conString, function (err, client, done) {
        client.query('SELECT link_title FROM links', function (err, result) {
            read_result = result.rows[0].link_title;
            console.log('from model');
            return read_result;
        });
    });

};

module.exports.read_result = read;

问题出在控制器中,我无论如何都找不到'data'console.log或res来运行。如果我将它们放在函数之外,它们会在返回数据之前运行,因此未定义。 如何正确格式化模型代码,以便在从模型返回结果后正确访问“数据”? 是否建议使用“异步”或“承诺”等模块来处理这种情况?

3 个答案:

答案 0 :(得分:0)

最简单的方法是将回调作为参数进行调用,然后调用数据。

var read = function(cb) {
    settings.pg.connect(settings.conString, function (err, client, done) {
        client.query('SELECT link_title FROM links', function (err, result) {
            if (err) {
                return cb(err);
            }

            cb(null, result.rows[0].link_title);
        });
    });
};

答案 1 :(得分:0)

将回调传递给读取功能

答案 2 :(得分:0)

您需要处理回调中的数据,因为nodejs是异步

var express = require('express'),
directory_router = express.Router(),
directory_models = require('./directory_models');

directory_router.get('/list', function(req, res) {
var data = directory_models.read_result(function (err, data) {
    if (err){
       res.status(400).send("cant get data");
    } 
    else{
    console.log(data); // Need returned data here, but won't run
    res.send(data); // Same
    }
});
// If I try to access 'data' here it's empty
});

在内部模型中,您需要将回调作为一个参数:

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

var read = function(callback) {
var read_result;

settings.pg.connect(settings.conString, function (err, client, done) {
    client.query('SELECT link_title FROM links', function (err, result) {
if(err){ return callback(err,null) }
else{
        read_result = result.rows[0].link_title;
        console.log('from model');
        return callback(null, read_result);
    });
});

};  
module.exports.read_result = read;