2013-05-10 34 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 2013-05-10 23:38:41

+0

是的。它是一個傳遞給函數的參數數組。 – 2013-05-10 23:41:05

+0

謝謝,實現它需要一段時間,因爲mainFuction中還有其他代碼,我將不得不移動。我會讓你知道它是如何工作的。 – user2221845 2013-05-10 23:43:15

相關問題