需要函数等待事件处理程序完成后再执行下一个函数

Need function to wait until event handler has finished before executing next function

本文关键字:函数 执行 下一个 程序 等待 事件处理      更新时间:2023-09-26

我见过许多类似的问题,但没有一个能真正回答我的问题。我原以为这很简单,但我想它不是。

我需要调用一个函数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
    }

这很棘手。您确实需要某种队列(函数调用或查询参数的队列)。查询处理程序(如果需要,也可以是结果处理程序)将在队列完成后启动下一个查询。

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();
}