2

私は多くの同様の質問を見てきましたが、実際に私の問題に答えたものはありません. 簡単だと思いますが、そうではないと思います。

関数を 20 回呼び出す必要があり、それぞれ異なる SQL ステートメントのセットを使用します。呼び出された関数は SQL クエリを実行し、結果は eventHandler によって処理されます。次の関数呼び出しを実行する前に、イベント ハンドラーのチェックを終了する必要があります。

イベント ハンドラーは非同期であるため、呼び出し元の関数はハンドラーを待たずに完了します。次の queryFunction に進む前に、queryFunction が queryHandler が完了するのを待つ必要があります。私のプロジェクトは 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
    }
4

1 に答える 1

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();
}
于 2013-05-10T23:29:13.057 に答える