2016-11-16 6 views
1

すべての行を取り、WordListに行をプッシュするテーブルでMYSQLクエリを使用して配列にデータを挿入しようとしています。MySQLクエリのコールバックを返し、Node.jsの配列にプッシュするにはどうすればよいですか?

メソッド内の各行を印刷できますが、そのメソッドの範囲外に出ると、Wordlistに何もプッシュされません。

function getParrotMessage() { 

    wordList = []; 

    console.log(wordList); 

    // Implementation 
    getWord('result', function (err, result) { 

     console.log(result); // works, prints the row data in MySQL table 
     wordList.push(result); // doesn't work 

    }); 

    console.log(wordList); 
    return parrot_message; 
} 

// Method 
function getWord(word, callback) { 
    var query = con.query('SELECT * FROM word_table'); 
    query.on('result', function (row) { 
     callback(null, row.word); 
    }); 
}; 

ワードリスト:[]

ワードリストが空の配列として現れます。

すべてのヘルプは大幅にちょうどjavascriptので始まり、感謝し、

+0

あなたの方法のようにそれを使用する 'getWord'は非同期**です**!したがって、最初に 'wordList.push(result);'を呼び出す前に、結果が返される前に2番目の 'console.log(wordList);'が出力されます。 – Molda

+0

どうすれば結果データを実際に取得できますかそれを操作したり、さまざまなことをすることができます。私はそれを印刷する必要はありません。 – user1920076

答えて

1

をNode.jsのことでしょうあなたの方法getWordは非同期です!すべての結果が返される前に(あなたも初めてwordList.push(result);を呼び出す前に)あなたがコールバックを使用する必要がgetParrotMessage機能に(非同期で)、DBを照会するのでだから、二console.log(wordList);

を印刷され

(またはPromiseなど)を使用することができます。

function getParrotMessage(callback) { 

    getWord('result', function (err, result) { 

     if(err || !result.length) return callback('error or no results'); 
     // since result is array of objects [{word: 'someword'},{word: 'someword2'}] let's remap it 
     result = result.map(obj => obj.word); 
     // result should now look like ['someword','someword2'] 
     // return it 
     callback(null, result); 

    }); 
} 

function getWord(word, callback) { 
    con.query('SELECT * FROM word_table', function(err, rows) { 
     if(err) return callback(err); 
     callback(null, rows); 
    }); 
}; 

は今、この

getParrotMessage(function(err, words){ 
    // words => ['someword','someword2'] 

}); 
+0

助けてくれてありがとう、それは働いている! – user1920076

関連する問題