我是NodeJS / Express的新手,并尝试了解回调函数。
我有一个Query的函数,它生成一个数组:
while (s.good()) {
// process.
}
在数组中我有“facil”,我想通过调用en外部函数进行设置。
conn.query('SELECT * FROM clients', function(err, rows, fields) {
if (err) {
res.status(500).json({"status_code": 500,"status_message": "internal server error"});
} else {
// Loop check on each row
for (var i = 0; i < rows.length; i++) {
var person = {
'fullname':rows[i].fullname,
'address1':rows[i].address,
'city':rows[i].city,
'facil': docall(rows[i].clientId, conn, respons)
}
// Add object into array
clientList.push(person);
}
// Render index.pug page using array
res.render('clients', {"clientList": clientList, testVar});
}
});
}
问题是我没有将值恢复为未定义。由于代码的异步运行。
但我怎么做呢???
如何通过调用另一个函数来设置数组中的值facil?
答案 0 :(得分:0)
您正在返回回调函数,然后尝试将其存储在facil
属性中,请尝试此操作
conn.query('SELECT * FROM clients', function (err, rows, fields) {
if (err) {
res.status(500).json({
"status_code": 500,
"status_message": "internal server error"
});
} else {
// Loop check on each row
for (var i = 0; i < rows.length; i++) {
doCall(rows[i].clientId, conn, function (err, respDocall) {
if (err) {
res.status(500).json(err);
}else{
var person = {
'fullname':rows[i].fullname,
'address1':rows[i].address,
'city':rows[i].city,
'facil': respDocall
}
clientList.push(person);
}
});
// Add object into array
}
// Render index.pug page using array
res.render('clients', {
"clientList": clientList,
testVar
});
}
});
function doCall(id, conn, callback) {
conn.query('SELECT COUNT(clientId) AS Antal FROM facility WHERE clientId =' + id, function (err, rows, fields) {
if (err) {
return callback({
"status_code": 500,
"status_message": "internal server error"
});
} else {
return callback(rows[0].Antal);
}
})
}
答案 1 :(得分:0)
您需要像这样在第二个函数上编写回调函数。以下是async
库的实现。
conn.query('SELECT * FROM clients', function(err, rows, fields) {
if (err) {
res.status(500).json({"status_code": 500,"status_message": "internal server error"});
} else {
async.eachSeries(rows,function(item,callback){
conn.query('SELECT COUNT(clientId) AS Antal FROM facility WHERE clientId =' +id, function(err, result, fields) {
if (err) {
return res.status(500).json({"status_code": 500,"status_message": "internal server error"});
} else {
var person = {
'fullname':item[i].fullname,
'address1':item[i].address,
'city':item[i].city,
'facil': result[0].Antal
}
clientList.push(person);
callback()
}
});
},function(){
//final callback here
res.render('clients', {"clientList": clientList, testVar});
})
}
})