2017-05-03 27 views
0

こんにちは、私は、次の手順で問題が生じています、私は最終的に一度、ループのためにあり、互いの上に構築し、複数のクエリを実行する必要がありますその結果を得るために結果が得られる。私は、私のループがクエリを過ぎてループしている問題を抱えています。また、findX関数の実行中にコードを停止する必要があります。Node.jsの非同期/同期

私は、これは非同期問題である知っているが、私はどのように私ができるチェーン約束参照するか、前のクエリの結果に依存ループクエリに必要と非同期NPMパッケージを使用しないでください。前もって感謝します。

function findX(){ 
     //executes another query 
    } 

function solve(res, connection, info, requestArr, callback){ 

     var parentID = null; 
     var obj = {}; 

     for (var i = 0; i <= requestArr.length; i++) { 

      connection.query("SELECT WHERE ", [parentID, requestArr[i]], function(err, results) { 
      if(results[0]['x']){ 
       var obj = findX(x) 
       break; 
      }else{ 
       parentID = results[0]['parentID']; 
      } 
      }); 
     } 

    //Do stuff with obj only after the final result has been set in the for loop 
     } 
+1

'非同期/ series' http://caolan.github.io/async/docs.html#に見てシリーズ –

答えて

0

Async TimesSeriesを使用できます。

// Pretend this is some complicated async factory 
var createUser = function(id, callback) { 
    callback(null, { 
     id: 'user' + id 
    }); 
}; 

// generate 5 users 
async.times(5, function(n, next) { 
    createUser(n, function(err, user) { 
     next(err, user); 
    }); 
}, function(err, users) { 
    // we should now have 5 users 
}); 

だから、あなたの例ではこのようなものになるだろう:

var iterations = requestArr.length - 1, 
    parentID, 
    obj; 

var getResults = function (i, callback) { 
    connection.query("SELECT WHERE ", [parentID, requestArr[i]], function (err, results) { 
     if (results[0]['x']) { 
      obj = findX(x); 
      callback('done'); 
     } 

     else { 
      parentID = results[0]['parentID']; 
      callback(); 
     } 
    }); 
}; 

async.timesSeries(iterations, function (n, next) { 
    getResults(n, function (err) { 
     next(err); 
    }); 
}, function (err) { 
    // use obj 
}); 
+0

私は別のコールバックラッパーまたは約束のクエリコールバック関数内でfindXの結果を取得するでしょうか? –

+0

@GrantWeiss、申し訳ありません、あなたの質問は... –