Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在执行下一个函数之前,需要函数等待事件处理程序完成_Javascript_Sqlite_Air - Fatal编程技术网

Javascript 在执行下一个函数之前,需要函数等待事件处理程序完成

Javascript 在执行下一个函数之前,需要函数等待事件处理程序完成,javascript,sqlite,air,Javascript,Sqlite,Air,我见过许多类似的问题,但没有一个真正回答了我的问题。我认为这很简单,但我想不是 我需要调用一个函数20次,每次调用一组不同的SQL语句。 调用的函数执行SQL查询,结果由eventHandler处理。我需要在执行下一个函数调用之前完成事件处理程序的检查 由于事件处理程序是异步的,调用函数将在不等待处理程序的情况下完成。我需要queryFunction等待queryHandler完成,然后再转到下一个queryFunction。虽然我的项目是AIR,但我怀疑这不是问题的一部分 我希望我已经很清楚了

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

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

谢谢你的回复,我想我理解这个解决方案。参数在队列中是否为文本。推送?是的,是。这是一个传递给函数的参数数组。谢谢,这将需要一段时间来实现,因为MainFunction中还有其他代码需要移动。我会让你知道它是如何工作的……它似乎已经工作了。我还有一个sql查询问题,它会混淆结果。但是,它看起来确实是在一次一个地执行查询。再次感谢你的帮助!我只是想确认一下解决方案。我修复了我的查询问题。这些函数现在按顺序运行,一次一个。谢谢