2013-05-10 6 views
2

У меня было много подобных вопросов, но никто не ответил на мою проблему. Я бы подумал, что это будет просто, но я думаю, что это не так.Нужна функция, чтобы дождаться завершения обработчика событий до выполнения следующей функции

Мне нужно вызвать функцию 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 
    } 

ответ

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

Благодарим за отзыв, я думаю, что понимаю решение. Являются ли аргументы буквальными в queue.push? – user2221845

+0

Да, это так. Это массив параметров, переданных функции. –

+0

Спасибо, это займет некоторое время, чтобы реализовать, поскольку в mainFuction есть другой код, который мне нужно будет переместить. Я дам вам знать, как это работает. – user2221845

Смежные вопросы