我见过许多类似的问题,但实际上没有人回答我的问题。我认为这很简单,但我猜它不是。
我需要调用一个函数20次,每个函数都有一组不同的SQL语句。 调用的函数执行SQL查询,结果由eventHandler处理。在执行下一个函数调用之前,我需要检查事件处理程序。
由于事件处理程序是异步的,因此调用函数在不等待处理程序的情况下完成。我需要queryFunction等待queryHandler完成才能进入下一个queryFunction。虽然我的项目是AIR,但我怀疑它不是问题的一部分。
我希望我已经清楚了,我对javascript相对较新。
function mainFunction(){
queryFunction (var1, var2); // There would be twenty of these with
queryFunction (var1, var2); // different values for var1 and var2
queryFunction (var1, var2);
queryFunction (var1, var2);
// etc, etc....
}
function queryFunction (){
var sqlStatment = 'SELECT Field1, Field2, Field3'+
'FROM [TableName] ' +
'WHERE Field1= var1 AND Field2= var2'; //simplified code
var stmt = new air.SQLStatement();
stmt.sqlConnection = conn;
stmt.text = sqlStatment;
stmt.addEventListener(air.SQLEvent.RESULT, queryHandler);
stmt.addEventListener(air.SQLErrorEvent.ERROR, errorHandler);
stmt.execute();
}
function queryHandler(event){
// queryHandler code
}
答案 0 :(得分:2)
这很棘手。你真的想要某种类型的队列(函数调用或查询参数)。您的查询处理程序(或结果处理程序,如果需要)将在完成后启动队列中的下一个查询。
var queue = [];
function mainFunction(){
queryFunction (var1, var2); // There would be twenty of these with
queryFunction (var1, var2); // different values for var1 and var2
queryFunction (var1, var2);
queryFunction (var1, var2);
go();
}
function queryFunction (){
queue.push( arguments );
}
function go() {
nextQuery();
}
function nextQuery() {
if (queue.length > 0)
{
params = queue.shift();
var sqlStatment = 'SELECT Field1, Field2, Field3'+
'FROM [TableName] ' +
'WHERE Field1= ' + params[0] + ' AND Field2= ' + params[1]; //simplified code
var stmt = new air.SQLStatement();
stmt.sqlConnection = conn;
stmt.text = sqlStatment;
stmt.addEventListener(air.SQLEvent.RESULT, queryHandler);
stmt.addEventListener(air.SQLErrorEvent.ERROR, errorHandler);
stmt.execute();
}
}
function queryHandler(event){
// queryHandler code
// ...
// and then...
nextQuery();
}