Javascript 异步函数不';跑不动
以下是nodejs应用程序上下文中的控制器内容:Javascript 异步函数不';跑不动,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,以下是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
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。如果我把它们放在函数之外,它们会在返回数据之前运行,因此是未定义的。
如何正确格式化模型代码,以便在从模型返回结果后能够正确访问“数据”?
建议使用诸如“异步”或“承诺”之类的模块来处理这种情况吗?最简单的方法是获取回调作为参数并调用,然后访问数据
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);
});
});
};
将回调传递给read函数您需要在回调中处理数据,因为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;
read
不接受回调。因此,您传递给它的回调未被使用。您可能需要进一步解释。。。