connection.queryはもしかして非同期実行ではないでしょうか?
なので、connection.queryが終わる前にconsole.logしてると思います。
Like!
データベースから取得したデータを処理したい。
ソースコードの一番下のconsole.logでqueryTextにデータが何も入っていない。
var queryText = [];
{
connection.query(
'SELECT problem_id FROM problem WHERE problem_id LIKE "%IT%" ORDER BY RAND() LIMIT 25',
(error, results) => {
var id = results;
//console.log(id);
for (var i = 0; i <= 24; i++) {
var problemid = id[i];
//console.log(problemid);
connection.query(
'SELECT * FROM problem WHERE problem_id = ?',
[problemid.problem_id],
(error, results) => {
queryText.push(results[0].problem_text);
//console.log(results[0].problem_text);
}
)
connection.query(
'SELECT * FROM choice WHERE problem_id = ?',
[problemid.problem_id],
(error, results) => {
//console.log(results);
}
)
}
}
);
}
console.log(queryText);
connection.queryが非同期処理なのは理解しました。
ですが、同期処理でデータベースからデータを取り出す方法が分かりません。
かなり行き詰まっているので助けてください。
connection.queryはもしかして非同期実行ではないでしょうか?
なので、connection.queryが終わる前にconsole.logしてると思います。
@Naoki23
Questionerさっぱり理解していないのですが、Promise
を使えば、非同期処理の処理順を制御できるのではないでしょうか。
「JavaScript Promiseの本」
Qiitaで「Promise」を検索
現状では結果に影響していないchoice
テーブルに対するクエリを無視すると、下記だけで要件を満たすように思われます。
var queryText = undefined;
connection.query(
'SELECT problem_text FROM problem WHERE problem_id LIKE "%IT%" ORDER BY RAND() LIMIT 25',
(error, results) => {
queryText = result.map((item) => item.problem_text);
console.log(queryText);
}
);
@Naoki23
Questioner@Naoki23
Questioner@monaka_ben_mezd さん、 @tetr4lab さん
お忙しい中回答ありがとうございました!
choiceのデータも取得する事ができたので @monaka_ben_mezd さんが書いてくださったコードを使って開発を進めようと思います。