我有一个将由多个应用程序使用的通用模块。该模块有一个具有多种方法的对象。我通过require语句导入对象,但是我在理解如何在异步编程模型中获取返回值时遇到问题。让我在下面的过度简化的伪代码中阐明它:
文件common_module.js:
var mysql = require('mysql');
exports.f1 = function() {
var connection_pool = mysql.createPool({host: 'xxx', user:..});
connection_pool.getConnection(function(err, connection) {
connection.query('SELECT c1 from t1 where c2 = ?', value, function(err, rows) {
value_to_return = rows[0].content; //string type
});
});
return (value_to_return);
}
主应用程序是,例如,main.js:
db_getval = require('./common_module.js');
console.log(db_getval.f1());
它总是会抱怨value_to_return是未定义的,因为执行return语句而不等待查询完成(感谢异步编程模型)。虽然这是一个与mysql查询相关的问题,但对于许多其他场景也是如此。我该如何解决这个问题?我错过了一些基本的东西......
答案 0 :(得分:1)
在这种情况下,您可以使用promises或回调。
节点中的回调是处理此类工作的事实上的方式:
var mysql = require('mysql');
exports.f1 = function (cb) {
var connection_pool = mysql.createPool({
host: 'xxx',
user: ..
});
connection_pool.getConnection(function (err, connection) {
if (err) {
return cb(err);
}
connection.query('SELECT c1 from t1 where c2 = ?', value, function (err, rows) {
if (err) {
return cb(err);
}
cb(null, rows[0].content);
});
});
};
// usage...
theModule(function (err, result) {
console.log(err, result);
});
也就是说,随着节点0.12中的承诺的引入,由于更强大的错误处理,承诺变得越来越流行。 (链接也非常有用)
var mysql = require('mysql');
exports.f1 = function (cb) {
return new Promise(function (resolve) {
var connection_pool = mysql.createPool({
host: 'xxx',
user: ..
});
connection_pool.getConnection(function (err, connection) {
if (err) {
throw err;
}
connection.query('SELECT c1 from t1 where c2 = ?', value, function (err, rows) {
if (err) {
throw err;
}
resolve(rows[0].content);
});
});
});
};
// usage...
theModule().then(function (result) {
console.log(result);
}).catch(function (err) {
console.log(err, err.stack);
});