2017-05-03 146 views
0

你好我有以下序列的問題,我需要運行多個查詢其建立在彼此是在一個for循環,然後一旦最終結果得到實現的結果。我有在我的for循環是循環經過查詢的問題,我也需要停止代碼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,對不起,我沒有得到你的問題... –