2017-02-26 11 views
1

私の問題は、私がユーザーの配列を取得して、それぞれがそれぞれのsqlRequestを起動し、配列を押して1つずつ進まない非同期を実行しようとしているときです。それぞれasyncのSQL​​クエリ

sqlRequestを1つずつ実行し、各ユーザーsqlRequestと配列内のプッシュですべて実行する必要はありません。ここで

は、ここで各

function getUserFavCat(params, callback) { 
    var usersArrayCat = []; 
    async.each(params, function (user, cb) { 
    sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { 
     if (!result) { 
     //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) 
     } else if (result.length == 0) { 
     //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) 
     } else { 
     user.favouriteCat = utils.takeMostRepeatingObj(result); 
     usersArrayCat.push(user); 
     } 
     cb(); 
    }) 
    }, function() { 
    callback(null, usersArrayCat) 
    }); 
}; 

非同期であるSQLクエリです:

function sqlRequest (sqlQuery, callback) { 
    var connection = new sql.Connection(sql_conf, function (err) { 
    if (err){ 
     console.log(err) 
    } else { 
     var request = new sql.Request(connection); 
     request.query(sqlQuery, function(err, result) { 
     console.log(result) 
     if(err){ 
      console.error(err) 
     } else if(!result){ 
      console.error("NO RESPONSE SQL QUERY") 
     } else { 
      callback(null, result); 
      connection.close(); 
     } 
     }) 
    } 
    }); 
    connection.on('error', function(err) { 
    console.log(err); 
    }); 
}; 
+1

あなたの質問には関係ありませんが、そのようなクエリを作成しないでください - あなたはSQLインジェクションに穴を開けています。 –

+0

しかし、どのようにSQLクエリでループを実行する必要がありますか? –

+0

申し訳ありません、この部分は 'WHERE st.id =" + user.id'です。文字列を連結しないでください。使用するライブラリが何であれ、パラメータ化されたクエリを作成できるようにしてください。 –

答えて

1

usersArrayCatアレイにそれをプッシュすることができます。の質問

function getUserFavCat(params, callback) { 
    var usersArrayCat = []; 
    console.log(`length of array ${params.length}`) 
         // 1 here means 1 request at a time 
    async.eachLimit(params, 1, function (user, cb) { 
     sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { 
      if (!result) { 
       //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) 
      } else if (result.length == 0) { 
       //console.error("NO FAVOURITE CATEGORY FOR USER " + JSON.stringify(user)) 
      } else { 
       user.favouriteCat = utils.takeMostRepeatingObj(result); 
       usersArrayCat.push(user); 
       cb(); 
      } 
     }) 
    }, function (err) { 
     if (err) return callback(err); 
     callback(null, usersArrayCat) 
    }); 
}; 
0

は、アレイへのすべてのコールバックasync.mapとプッシュを使用して、このトリックを試してみてください。そして、あなたは成功のユーザーのためのコールバック結果をフィルタリングするためにasync.parallelを使用していない制限するために使用async.eachLimit

function getUserFavCat(params, callback) { 
    var usersArrayCat = [], callbackArrays = []; 
    async.map(params, function (user, cb) { 
    callbackArrays.push(function (cb) { 
     sqlRequest("SELECT b_cat.title, b_cat.id FROM dbo.Students st INNER JOIN dbo.SaleView sv ON sv.userId = st.id INNER JOIN dbo.KEY_BrandcategoryToSale b_key ON b_key.saleId = sv.saleId INNER JOIN dbo.BrandCategories b_cat ON b_cat.id = b_key.brandCategoryId WHERE st.id = " + user.id, function (err, result) { 
     if (!result) { 
     user.status = '99'; // error status 
     cb(null, user); 
     } else if (result.length == 0) { 
     user.status = '99'; // error status 
     cb(null, user); 
     } else { 
     user.favouriteCat = utils.takeMostRepeatingObj(result); 
     user.status = '00'; //success status 
     cb(null, user); 
     } 
    }); 
    }, function(err, results) { 
    // comes here after all individual async calls have completed 
    // check errors; array of results is in data 
    cb(null, results) 
    }); 

    async.parallel(callbackArrays, function (err, results) { 
     results.forEach (function (elem, ind) { 
     if (elem.status == '00') { 
      usersArrayCat.push(elem); 
     } 
     }); 
    }); 
}; 
+0

いいえ問題はそれがステップバイステップではなく、各ユーザーが問合せを進めるたびにコールバックに行くということです –

関連する問題