我正在编写一个应用程序,它允许您通过表单中的Ajax POST调用将访问次数(访问日期,访问类型,注释)添加到案例中。访问创建功能使您可以在多个日期添加相同的访问类型和注释。因此,我最终得到一个访问对象,该对象中包含一个日期数组,但注释和访问类型相同。由于SQL不是我应该进行的任何循环,因此我想在Node中进行,因为我将能够处理数组中的任何故障或从各个SQL调用返回的结果。
我尝试设置过程调用,以使其按照here的形式将数组中的数组作为参数,但是我无法使其正常工作,所以我回过头来遍历。
我遇到的问题是在获得任何结果之前完成回调。显然是因为我对回调的理解不够,没有足够的阅读方法使它变得更清晰,所以我最终在这里寻求帮助。
下面是执行的代码。作为insertVisit函数参数的访问对象是带有日期数组的上述类。
this.insertVisit = function (req, res, visit)
{
var insertVisit = new Visit();
insertVisit = visit;
var success = 0;
var visitId = 0;
//Split the visits into an array of individual dates
var allVisits = insertVisit.visitDates.split(',');
//Attemp to call insertVisits using a callback
insertVisits(0, function(err){
if( err ) {
console.log('yeah, that insert didnt work: '+ err)
}
});
console.log('finished');
function insertVisits(v)
{
//Loop through all of the visits
if (v < allVisits.length )
{
//Attempt to call the next function
singleDate(allVisits[v], function(err)
{
if(err)
{
console.log(err);
}
else
{
//if everything is successful, insert the next individual date
allVisits[v + 1];
}
})
}
}
function singleDate(singleVisitDate)
{
var query = 'CALL aau.sp_InsertVisit (?,?,?,?,?,?,?,@visitId,@success); SELECT @visitId, @success;';
var parts = singleVisitDate.split('-');
var formattedDate = new Date(parts[2], parts[1] - 1, parts[0]);
connection.init();
//Everything runs fine up to here, but as soon as we go to the next line, the program
//continues back at the end of the loop in the insertVisits function an exits the function.
//At this point the below code executes asynchronously and inserts one of the dates before returning
//and doesn't call any further dates.
connection.acquire(function (err, con)
{
con.query(query,
[
insertVisit.caseId,
formattedDate,
parseInt(insertVisit.visitTypeId),
parseInt(insertVisit.visitStatusId),
insertVisit.adminNotes,
insertVisit.operatorNotes,
insertVisit.isDeleted,
visitId,
success
]
, function (err, result)
{
if(err)
{
console.log(err);
}
else
{
con.release();
res.write(JSON.stringify(result));
}
})
})
}
因此,我试图遍历每个日期,并为每个日期调用存储过程,然后使用res.write将结果添加到响应中。
这是一个全新的项目,很高兴用Promise或Asynch / await重写它。但是,通过多个过程调用进行循环的任何示例将不胜感激
答案 0 :(得分:0)
好吧
因此,我研究了使用async.eachSeries并设法在将回调放在“树”的底部时使其工作。
希望这对尝试多次运行同一proc的其他人很有帮助。
this.insertVisit = function (req, res, visit)
{
var insertVisit = new Visit();
insertVisit = visit;
var success = 0;
var visitId = 0;
var allVisits = insertVisit.visitDates.split(',');
async.eachSeries(allVisits, function(singleVisitDate, callback)
{
var query = 'CALL aau.sp_InsertVisit (?,?,?,?,?,?,?,@visitId,@success); SELECT @visitId, @success;';
var parts = singleVisitDate.split('-');
var formattedDate = new Date(parts[2], parts[1] - 1, parts[0]);
connection.init();
connection.acquire(function (err, con)
{
con.query(query,
[
insertVisit.caseId,
formattedDate,
parseInt(insertVisit.visitTypeId),
parseInt(insertVisit.visitStatusId),
insertVisit.adminNotes,
insertVisit.operatorNotes,
insertVisit.isDeleted,
visitId,
success
]
, function (err, result)
{
if(err)
{
console.log(err);
}
else
{
con.release();
res.write(JSON.stringify(result));
callback();
}
})
})
},
function(err)
{
if(err)
{
console.log(err);
}
else
{
res.end();
}
});