2017-06-27 18 views
0

私はクライアントから与えられたリストのforEachステートメントでクエリを取得しようとしています。Node.js非同期の複数のクエリ

結果をフェッチした後、結果をクライアントに取得できるように結果が配列にプッシュされます(明らかに書式設定した後)。

問題は、複数の非同期クエリがmysqlで実行されていることです。問題を解決する方法がわかりません。

var select = function(list, flag, callback){ 
list.forEach(function(element){ 
    if (flag && (element != '')){ 
     connection.query(sql, function (err, result) { 
      if (err) {throw err;} 
      callback(result); 
     }); 
    } else if (element != ''){ 
     connection.query(sql, function (err, result) { 
      if (err) {throw err;} 
      callback(result); 
     }); 
    } 
}); 
}; 

私は約束で作業しようとしましたが、私はそれらを使ったことがないので、私はそれを構造化するための適切な方法を見つけ出すことができませんでした、次のポストresolveメソッド

var results = []; 
if (req.body.ip == undefined){ 
    mysql.select(req.body.field1.split('\r\n'), false, function(result){ 
     results.push(result); 
    }); 
} else if (req.body.name == undefined){ 
    mysql.select(req.body.field2.split('\r\n'), true, function(result){ 
     results.push(result); 
    }); 
} 
res.send(results); 

を使用してこの関数を呼び出します前。

誰かが私に手を貸すことができたら、私は本当にそれを感謝します!

EDIT:FIXED IT !!!!!私はこれを使った。

enter code herevar select = function(list, flag, callback){ 
var promises = []; 
list.forEach(function(element){ 
    if (flag && (element != '')){ 
     promises.push(new Promise(function(resolve, reject){ 
      connection.query(sql, function (err, result) { 
       if (err) {reject(err);} 
       resolve(callback(result)); 
      }); 
     })); 
    } else if (element != ''){ 
     promises.push(new Promise(function(resolve, reject){ 
      connection.query(sql, function (err, result) { 
       if (err) {reject(err);} 
       resolve(callback(result)); 
      }); 
     })); 
    } 
}); 
return promises; 
}; 

そしてこの

var results = []; 
if (req.body.ip == undefined){ 
    Promise.all(mysql.select(req.body.field1.split('\r\n'), false, function(result){ 
     results.push(result); 
    })).then(function(){ 
     res.send(results) 
    }); 
} else if (req.body.name == undefined){ 
    Promise.all(mysql.select(req.body.field2.split('\r\n'), true, function(result){ 
     results.push(result); 
    })).then(function(){ 
     res.send(results) 
    }); 
} 
+3

「私は約束で仕事をしました」 - あなたが試したことを示してください。約束、とりわけ 'Promise.all'はおそらくあなたが必要とするものです –

+0

私はその機能を約束してみましたが、どういうものが正確に働くのか分かりませんが、それを持っていないと同じ結果を返します。クエリが準備が整う前に実行されます。 –

答えて

0

のような主要なコードですが、非同期機能を使ってみましょう。我々は、彼らが完了したら、知っているので、継続へのmapリストを聞かせ、今

const util = require("util"); 
connection.queryAsync = util.promisify(connection.query); 

- 約束が値+時間であるだけで何かであり、あなたが値にアクセスすることができます:まず、のにpromisifyあなたのコールバックを返す関数を聞かせて次いで:

今、あなたの実際のコードでは、それはfunction fooそれはasync function fooにする必要がありましたので、場合asyncとしての機能をマークして、私たちが使用することができます簡単に非同期を-待つ:

async function select(list, flag) { 
    const relevant = list.filter(x => x != "") 
    const ps = flag ? list.map(x => connection.queryAsync(x.a)) 
        : list.map(x => connection.queryAsync(x.b)); // or whatever 
    return await Promise.all(ps); 
}; 

はその後、外

select([...], ...).then(() => console.log("All done!")); 

に注意:あなたの問題への真の解決策は、おそらくSQL側で解決している - これはかなり可能性がはるかに高速に実行されますNクエリよりも、単一のクエリする必要があります。

関連する問題