我有一个连接到MsSQL数据库的函数来获取一些数据并构建一个文本语句,这里是:
function getActions(issue_id, callback){
var action = '';
var conn2 = new sql.Connection(config, function(err) {
if(err){
showNotification('error connecting for selecting actions for ALL issues: ' + err.message, 'danger', 'glyphicon glyphicon-tasks');
} else {
var request = new sql.Request(conn2);
request
.input('issue_id', sql.Int,issue_id)
.query('SELECT [date], [description] FROM [actions] WHERE [issue_id] = @issue_id')
.then(function(data2) {
action ='<tr>'+
'<td style="vertical-align: top;" class="bold">action:</td>'+
'<td>'+
'<table>';
data2.forEach(function(data21){
action +='<tr>'+
'<td>'+data21.date+'</td>'+
'<td>'+data21.description+'</td>'+
'</tr>';
});
action += '</table>'+
'</td>'+
'</tr>'+
'</tbody>'+
'</table>';
console.log(action);
callback(null, action);
}).catch(function(error) {
showNotification('Error on selecting actions for ALL issues:' + error.message, 'danger', 'glyphicon glyphicon-tasks');
});
}
});
}
但是当我在我的代码中的另一个地方使用该函数它返回undefined而不是text语句时,我在return语句之前创建一个console.log(action)它返回正确的文本.....我做了不知道在使用函数
时返回undefined的原因UPDATE 当我使用Aruna的功能时我正在使用这样的功能:
for(let b=0;b<id.length;b++){
getActions(id[b],function(err, action) {
arrAction[b] = action;
});
}
答案 0 :(得分:0)
当您异步连接和查询MySQL数据库时,您不能指望同步返回数据。
你应该使用'回调'来处理这个问题。
所以你的代码就像这样,
function getActions(issue_id, callback){
var action = '';
var conn2 = new sql.Connection(config, function(err) {
if(err){
showNotification('error connecting for selecting actions for ALL issues: ' + err.message, 'danger', 'glyphicon glyphicon-tasks');
} else {
var request = new sql.Request(conn2);
request
.input('issue_id', sql.Int,issue_id)
.query('SELECT [date], [description] FROM [actions] WHERE [issue_id] = @issue_id')
.then(function(data2) {
action ='<tr>'+
'<td style="vertical-align: top;" class="bold">action:</td>'+
'<td>'+
'<table>';
data2.forEach(function(data21){
action +='<tr>'+
'<td>'+data21.date+'</td>'+
'<td>'+data21.description+'</td>'+
'</tr>';
});
action += '</table>'+
'</td>'+
'</tr>'+
'</tbody>'+
'</table>';
console.log(action);
callback(null, action);
}).catch(function(error) {
showNotification('Error on selecting actions for ALL issues:' + error.message, 'danger', 'glyphicon glyphicon-tasks');
});
}
});
}
你应该这样打电话,
var issue_id = 12;
getActions(issue_id, function(err, action) {
// to do
});
另外,像这样改变你的for循环,就像在循环中调用异步函数一样,for循环变量“b”将在响应来自函数之前被更改
var arrAction = [];
for(let b=0;b<id.length;b++){
getActions(id[b],function(err, action) {
arrAction[arrAction.length] = action;
});
}
答案 1 :(得分:0)
getActions
不返回任何内容。
return action
,与sql.Connection
类有关。也许你应该在return conn2;
结束时getActions
?没有关于你在做什么的背景很难说。