0

リクエストを作成し、返されたデータをリクエストの「行」イベントで cb のオブジェクトに追加してから、「完了」cb で何かを実行しようとしています。ものすごく単純; ただし、「完了」イベントは明らかにトリガーされていません。これが私の現在のコードです:

var connection = new Connection(config);
var executeTest = function (connection) {
 var result = [];
 var statement = "select val1, val2 from table;"

 var request = new Request(statement, function (err, rowCount) {
   if (err) {
    console.log(err);
   }
   console.log(rowCount);
   connection.close();
 });

 request.on('row', function(columns) {
  var thisRow = {};
  columns.forEach(function(column) {
    thisRow[column.metadata.colName] = column.value;
    result.push(thisRow);     
  });
  console.log(result); //not empty
  //tried making request2 here, no dice
  //tried making a second connection here, no dice
  //got error:
  //'requests can only be made in the LoggedIn state, 
  //not the SentClientRequest state' :(
 })  

 request.on('done', function (rC, more, row) { //never called
   console.log(rC, more, row);
   //other things to do
 })
 connection.execSql(request);

}

function test () {
 var connection = new Connection(configure);
 connection.on('connect', function(err) {
   if (err) {console.log(err);}
   console.log("Connected");
   executeTest(connection);
 })
}

test();
console.log(result); // []
//make second request using values from result

また、クエリの結果を別のクエリのパラメーターとして使用する方法を誰かが説明できれば、それは素晴らしいことです。test を呼び出した後、obv の結果は空ですが、request.on('row', cb) で空でない場合、現在の thisRow obj を使用してその cb で 2 番目の要求を行うことができませんでした。トランザクションを使用する必要がありますか? もしそうなら、最初のクエリの結果が2番目のクエリにパラメータとして渡される面倒なトランザクションでネストされたクエリを実行する方法の例を教えてください。ありがとう。

4

1 に答える 1

0

2 番目のリクエストを作成するには、退屈なリクエストをラップする関数にコールバックを渡す必要があります。簡単にするために、コードを少し簡略化しました。

var statement = "select val1, val2 from table";

function executeTest(connection, callback) {

    var results = [];

    var request = new Request(statement, function(error) {

        if (error) {
            return callback(error);
        }
        // pass the results array on through the callback
        callback(null, results);
    });

    request.on("row", function(rowObject) {
        // populate the results array
        results.push(rowObject);
    });
    connection.execSql(request);
}

function test() {
    /*
    create connection code
     */
    executeTest(connection, function(error, results) {
        // here is the results array from the first query
        console.log(results);
    });
}

test();

重要な点は、リクエストが非同期であるため、結果をコールバックに渡す必要があることです。つまり、コードを別の場所に置きたい場合は、コールバック パラメータを に渡す必要がありますexecuteTest

于 2016-02-26T15:46:51.703 に答える